Symfony教程中的PHP语法
尝试了解Symfony的最新情况,请阅读本教程,本页()中有以下示例:Symfony教程中的PHP语法,php,symfony,syntax,operators,Php,Symfony,Syntax,Operators,尝试了解Symfony的最新情况,请阅读本教程,本页()中有以下示例: $form = $this->createFormBuilder($task) ->add('task', TextType::class) ->add('dueDate', DateType::class) ->add('save', SubmitType::class, array('label' => 'Create Post')) ->getForm
$form = $this->createFormBuilder($task)
->add('task', TextType::class)
->add('dueDate', DateType::class)
->add('save', SubmitType::class, array('label' => 'Create Post'))
->getForm();
return $this->render('default/new.html.twig', array(
'form' => $form->createView(),
));
由于以前从未见过这种语法,我很快排除了表面上看起来的调用链接,然后发现将每个“裸”箭头解释为指向$form
的方法基本上是正确的。它最终在这个版本中正常工作:
$formBuilder = $this->createFormBuilder($task);
$formBuilder->add('task', TextType::class);
$formBuilder->add('dueDate', DateType::class);
$formBuilder->add('save', SubmitType::class, array('label' => 'Create Post'));
$form = $formBuilder->getForm();
return $this->render('default/new.html.twig', array(
'form' => $form->createView(),
));
所以我试着理解原始样本。如果对看似断开连接的箭头的正确解释是“第一行上命名的对象的调用方法”,则这将解释除“->getForm();
”行之外的所有内容。但是,如果对该行应用相同的规则,该行将变成“$formBuilder->getForm();
”,这当然会在render()行失败,因为没有对$form进行赋值(我的意思是,即使我为构建器保留了$form的名称,它仍然会失败)
那么,教程中是否有错误,或者我遗漏了哪些微妙的语法
我已经用(“php”、“arrow”、“syntax”、…)的组合进行了广泛的搜索,但没有找到任何关于在一系列方法调用中省略对象名的内容。原始示例确实是方法链接 如果您看到此示例:
$form = $this->createFormBuilder($task)
->add('task', TextType::class)
->add('dueDate', DateType::class)
->add('save', SubmitType::class, array('label' => 'Create Post'))
->getForm();
它只是意味着方法
createFormBuilder
,add
,getform
都属于同一个类$this
,因此它们大部分返回return$this代码>从每个方法,用于将方法链接到下一个方法<代码>文本类型::类
,其余为类常量 这实际上是方法链接。单独方法调用之间的新行只是为了更好的代码可读性
这:
相当于:
$formBuilder = $this->createFormBuilder($task)
->add('task', TextType::class);
通过查找
FormBuilder::add
的定义来验证它是否链接-它返回修改后的FormBuilder
对象。然后,该集合中的最后一行是一个聪明的技巧,因为尽管返回类型不同,但它是最后一行,然后使用相同的名称意味着毕竟定义了$form
。为了代码的可读性,我仍在修改它,这样读者就不必查找方法定义,而本教程可能会更好地提供一个快速解释(他们的问题都依赖于此)。add
和getForm
不属于$this
createFormBuilder
属于$this
并返回一个FormBuilder[Interface]
,该类有方法add
(返回自身进行方法链接)和getForm
(返回Form[Interface]
,因此您不能再链接FormBuilder[Interface]
方法,但形式[接口]
方法)。
$formBuilder = $this->createFormBuilder($task)
->add('task', TextType::class);