猿问

如何访问在 PHP 中的函数和方法中动态创建的变量?

我无法访问在 PHP 对象的函数或方法中动态创建的变量。这可能是作用域的问题,但我不知道为什么会发生这种情况,因为在 JavaScript 中,当您在函数内部声明 var 时,您仍然可以在该函数外部访问它。


我正在做的是这样的:


#code

...


$inputs = ['olympiad', 'test_type', 'year', 'level', 'country', 'test', 'answersheet'];


$Form = new Form;

$Form->addFields($inputs);


foreach (array_keys($Form->fields) as $key) {

  ${"$key"} = $Form->fields["$key"];

}


$olympiad->required(true)->type('select')->inValues($olyimpiadsArray)->label('Olmpíada')->errorMessage('some error message here');

$test_type->required(true)->type('select')->inValues($testTypeArray)->errorMessage('bla bla');

$level->required(true)->type('select')->inValues(['Nacional', 'Regional'])->label('Nível')->errorMessage('sample error message');

$year->required(true)->type('int')->range(1998, 2019)->label('Ano')->errorMessage('another error message');

$country->required(true)->type('string')->range(4, 64)->label('País')->errorMessage('these arent the real error messages');

$test->type('file')->label('Prova')->allowedExtensions(['pdf'])->errorMessage('bla bla');

$answersheet->type('file')->label('Gabarito')->allowedExtensions(['pdf'])->errorMessage('bla bla bla');

这是有效的,因为字段是对象并且它们作为引用传递,所以我可以通过内部创建的变量访问这些对象,foreach并且表单也将能够验证字段对象。


我foreach在许多网页中都使用相同的代码,所以很尴尬,因为我一次又一次地复制和粘贴代码。


预期成绩


我想要什么?我想做这个:


Class Form {

  #code

  ...

  public function create_vars_for_fields() {

    foreach(array_keys($this->fields) as $key) {

      ${"$key"} = $this->fields["$key"];

    }

    return $this;

  }

}

然后,在我的 PHP 网页上,我应该能够做到这一点:


require_once 'Form.php';


$inputs = ['olympiad', 'test_type', 'year', 'level', 'country', 'test', 'answersheet'];


$Form = new Form;

$Form->addFields($inputs)->create_vars_for_fields();


#code

...


如何通过在函数或方法中动态创建这些变量来访问它们?


慕森王
浏览 141回答 1
1回答

狐的传说

我终于找到了一个聪明,清晰的方法来完成这个!该解决方案使用extract内置函数。虽然我不再需要它,因为我使用 Laravel 进行验证,但我仍然想分享答案,以便它可以帮助其他人。解决方案Class Form {  #code  ...  public function getFieldsCompacted() {    $compactedFields = [];    foreach(array_keys($this->fields) as $key) {      $compactedFiels["$key"] = $this->fields["$key"];    }    return $compactedFields;  }}然后,在代码上:require_once '/path/to/Form.php';$inputs = ['olympiad', 'test_type', 'year', 'level', 'test', 'answer_sheet'];$Form = new Form;$Form->addFields($inputs);extract($Form->getFieldsCompacted());这样我可以做到:$olympiad->required(true)->type('select')->inValues($olyimpiadsArray)->label('Olimpíada')->errorMessage('some error message here');$test_type->required(true)->type('select')->inValues($testTypeArray)->errorMessage('bla bla');$level->required(true)->type('select')->inValues(['Nacional', 'Regional'])->label('Nível')->errorMessage('sample error message');$year->required(true)->type('int')->range(1998, 2019)->label('Ano')->errorMessage('another error message');$test->type('file')->label('Prova')->allowedExtensions(['pdf'])->errorMessage('bla bla');$answersheet->type('file')->label('Gabarito')->allowedExtensions(['pdf'])->errorMessage('bla bla bla');而不是做:$Form->fields['olympiad']->required(true)->type('select')->inValues($olyimpiadsArray)->label('Olimpíada')->errorMessage('some error message here');$Form->fields['test_type']->required(true)->type('select')->inValues($testTypeArray)->errorMessage('bla bla');$Form->fields['level']->required(true)->type('select')->inValues(['National', 'State'])->label('Nível')->errorMessage('sample error message');$Form->fields['year']->required(true)->type('int')->range(1998, 2019)->label('Ano')->errorMessage('another error message');$Form->fields['test']->type('file')->label('Prova')->allowedExtensions(['pdf'])->errorMessage('bla bla');$Form->fields['answersheet']->type('file')->label('Gabarito')->allowedExtensions(['pdf'])->errorMessage('bla bla bla');编辑:RiggsFolly 指出使用extract. 我完全同意使用extractin$_POST和$_GET. 但是,这里的情况并非如此,因为要提取的变量的定义如您在$inputs = ['olympiad', 'test_type', 'year', 'level', 'test', 'answer_sheet'];. 因此,extract只会提取这些变量,而不会覆盖其他变量。因此,上面的代码没有风险。
随时随地看视频慕课网APP
我要回答