为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕森王 2021-10-22 15:33:33
我无法访问在 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...如何通过在函数或方法中动态创建这些变量来访问它们?
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

我终于找到了一个聪明,清晰的方法来完成这个!该解决方案使用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只会提取这些变量,而不会覆盖其他变量。因此,上面的代码没有风险。


查看完整回答
反对 回复 2021-10-22
  • 1 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信