2010-03-22 4 views
2

Peut-on expliquer par exemple ce que $ obj -> $ a() -> $ b signifie? J'ai utilisé PHP OOP assez longtemps et j'ai vu dans certains endroits cette structure et pas seulement $ obj -> $ a(); Dans quels cas devrais-je l'utiliser?PHP OOP sur la référence

Répondre

2
$a = 'someMethod'; 
$b = 'someProperty'; 
$obj->$a()->$b; 

est égal à:

$obj->someMethod()->someProperty; 

En savoir plus sur variable variables

1

un $ est le nom d'une méthode. Par conséquent, si $a = "myFunc", cela équivaut à:

$obj->myFunc()->$b; 

$ b semble être une référence à une propriété. La méthode semble renvoyer un objet, donc, si $b = "myProp", nous pouvons modifier cette valeur pour:

$obj->myFunc()->myprop; 

C'est vraiment mauvaise forme pour une meilleure compréhension.

+0

Juste pour ajouter à cette réponse, la méthode est Enchaînement très bien, si vos interfaces de classe sont réfléchis (voir jQuery). Ce n'est pas un chaînage de méthode, c'est une méta-programmation. L'utilisation de variables ici, pour les noms d'objet et de méthode, rend le débogage plus difficile lorsque vous avez déplacé ces appels vers l'environnement d'exécution. Je ne peux pas dire si cette décision était bonne parce que le code n'est pas donné en contexte. –

+0

Je suis d'accord que le chaînage de méthode est bien. Je pense cependant que le fait que nous ne puissions pas dire si ce code est raisonnable est un bon indicateur que ce n'est pas le cas. Il essaie d'être trop intelligent. –

1

Cela signifie que $a() renvoie un objet, et que $b est un membre de l'objet $a() renvoie.

Cette méthode est appelée enchaînant lorsque chaque méthode retourne l'objet original, donc différentes méthodes du même objet peut être appelé sans avoir à préciser à plusieurs reprises $obj-> avant chaque appel.

+0

Cela peut certainement être le cas, mais il se peut qu'il ne soit pas chaîné si $ a renvoie un objet autre que $ obj. –

+0

À droite, ce n'est pas le chaînage si différents objets sont renvoyés. Mais normalement, quand vous voyez cette syntaxe, elle fait partie d'une chaîne. Sinon, je considérerais cela comme une mauvaise pratique. –

+0

Merci beaucoup! J'ai appris une nouvelle fonctionnalité utile dans PHP5 OOP pour moi. – Starmaster

1

Le terme réel est Interface Courant, comme indiqué est retourne l'objet original, Heres une classe exemple complet

Class Fluent { 
public $var1; 
public $var2; 

function setVar1($value) { 
    $this->var1 = $value; 
    return $this; 
} 

function setVar2($value) { 
    $this->var2 = $value; 
    return $this; 
} 

function getVars() { 
    echo $this->var1 . $this->var2; 
} 
} 

$fluent = new Fluent(); 
$fluent->setVar1("Foo")->setVar2("Bar")->getVars(); 

qui va évidemment revenir "foobar".

HTH