2017-04-30 13 views
0

はチュートリアルを通して行く、symfonyで速度まで取得しようとすると、このページ(symfony.com/doc/current/forms.html)に次のサンプルである:Iすぐ前にこの構文を見たことがないたPHP構文は

$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();"になります。もちろん、$ formへの割り当てがないためにrender()行に失敗します。ビルダーの名前は$形式になっていました)。

このチュートリアルでは間違いがありますか、どのような構文の微妙な部分がありますか?

( "php"、 "arrow"、 "syntax"、...)の組み合わせで広範囲に検索しましたが、一連のメソッド呼び出しでオブジェクト名を省略することについては何も見つかりませんでした。

答えて

0

これは実際にはメソッドチェーンです。別々のメソッド呼び出し間の新しい行は、コードの読み易さを向上させるためだけです。

この:

$formBuilder = $this->createFormBuilder($task); 
$formBuilder->add('task', TextType::class); 

がこれに相当します

$formBuilder = $this->createFormBuilder($task) 
->add('task', TextType::class); 
+0

'FormBuilder :: add'の定義を参照して連鎖していることを確認し、変更された' FormBuilder'オブジェクトを返します。戻り値の型は異なりますが、最後の行ですが、同じ名前を使用すると '$ form'がすべて定義されていることを意味するので、そのセットの最後の行は巧妙なトリックです。私はコード内の読みやすさのためにそれを変更しているので、読者はメソッド定義を調べる必要はなく、チュートリアルは素早く説明できます(彼らは質問に頼っています)。 –

1

元のサンプルは確かにメソッド連鎖です。

あなたはこの例で表示された場合:

$form = $this->createFormBuilder($task) 
    ->add('task', TextType::class) 
    ->add('dueDate', DateType::class) 
    ->add('save', SubmitType::class, array('label' => 'Create Post')) 
    ->getForm(); 

をそれは単に方法createFormBuilderaddgetformすべてがそう、彼らはほとんどに連鎖させるための方法のために、それぞれの方法からreturn $this;を戻ってきている同じクラス$thisに属していることを意味し次のTextType::classであり、残りはクラス定数です。

+0

'add'と' getForm'は '$ this'に属していません。 'createFormBuilder'は' $ this'に属し、 'FormBuilder [Interface]'を返します。**クラスは 'add '(メソッド連鎖のために自身を返します)と' getForm'( 'Form [Interface]'それ以来 'FormBuilder [Interface]'メソッドを連鎖させることはできませんが、代わりに 'Form [Interface]'メソッドを連鎖させることはできません。 – ccKep