2017-09-19 3 views
0

Je l'ai vu deux comme ceux-ci:Que peut contenir la troisième section -> séquence de chaînage?

$this->propertyName; 
$this->methodName(); 

Et je sais que le code devrait ressembler à ceci:

class myClass{ 

    public $propertyName; 

    public function methodName(){ 
     // statements 
    } 
} 

J'ai vu récemment un code comme ceci:

$this->CI->form_validation->set_message('investigate', '{field} ' . lang('wrong')); 

Qu'est-ce que est CI(une méthode?)? Combien font form_validation? Qu'est-ce que set_message? Sont ces méthodes imbriquées? A quoi ressemble son code?

+1

* "Qu'est-ce que CI (une méthode?)? "* - Très probablement CodeIgniter, si c'est ce que vous demandez. Vous auriez besoin de lire les docs. –

+3

Ce ne sont pas des méthodes. Tout ce qui n'est pas entre crochets est juste une propriété, et cette propriété est susceptible d'être un objet dans cet exemple, puisque vous pouvez alors appeler les propriétés/méthodes de cet objet en utilisant un autre ->. Seul l'appel à set_message est un appel de méthode. C'est une syntaxe PHP assez basique, et similaire à la syntaxe OO que vous pouvez trouver dans d'autres langues. En C# cela pourrait ressembler à 'this.CI.form_validation.setMessage (' – ADyson

Répondre

1

Une méthode peut renvoyer un objet. Vous pouvez attribuer cet objet à une variable, puis appeler des méthodes sur elle:

$objB = $objA->getObjectB(); 
$objB->someMethod(); 

Ou vous pouvez ignorer l'affectation et juste inline il;

$objA->getObjectB()->someMethod(); 

Tant que vos méthodes renvoient des objets, vous pouvez juste garder les empiler:

$objA->getObjectB()->getObjectC()->getObjectD()->getObjectE(); 

est de même pour les propriétés de l'objet. Une propriété publique peut contenir un autre objet:

$objA->objB = new objectB(); 
$objA->objB->someMethodOnObjectB(); 

Ainsi, les méthodes qui retournent un objet et des propriétés publiques qui contiennent un objet peuvent être empilés comme celui-ci. Vous pouvez les mélanger aussi:

$objA->getObjectB()->somePropertyOnObjectB->someMethod(); 

Voir aussi Fluent Interface. Il est courant que les objets renvoient des instances d'eux-mêmes pour les méthodes de mutateur. Cela vous permet de transformer ceci:

$obj = new Object(); 
$obj->setFoo('foo'); 
$obj->setBar('bar'); 
$obj->setBaz('baz'); 
$obj->doSomething(); 

Dans ceci:

$obj = new Object(); 
$obj->setFoo('foo')->setBar('bar')->setBaz('baz')->doSomething(); 

Et en PHP 5.6+, vous ne devez pas même affecter l'objet à une variable, vous pouvez déréférencer l'appel new directement:

(new Object())->setFoo('foo')->setBar('bar')->setBaz('baz')->doSomething(); 
+0

Merci, mis à jour. –

0

CI est un object. Dans ce contexte précis, il s'agit d'une propriété de classe, d'un type d'objet. Théoriquement, vous pouvez également avoir une méthode/fonction qui renvoie un objet. Quelque chose comme:

$ClassInstance->MethodThatReturnAnObject()->ObjectProperty = 'bla'; 

ou même

$ClassInstance->MethodThatReturnAnObject()->ObjectMethod(); 

Et la chaîne peut continuer avec plus de niveaux.

0

CI est une propriété à l'intérieur du $ cet objet, form_validation est un autre objet à l'intérieur CI et set_message est une méthode à l'intérieur form_validation

<?php 
class FormValidation 
{ 
    public function set_message($message) 
    { 
     echo $message; 
    } 
} 

class CI 
{ 
    public $form_validation; 

    public function __construct() 
    { 
     $this->form_validation = new FormValidation(); 
    } 
} 

class MyClass 
{ 
    public $CI; 

    public function __construct() 
    { 
     $this->CI = new CI(); 
    } 

    public function doSomeStuff() 
    { 
     $this->CI->form_validation->set_message('my custom message'); 
    } 
} 

$object = new MyClass(); 
$object->doSomeStuff();