2010-09-22 5 views
5

Ok, j'ai été la navigation du code source php et ont besoin de savoir comment la classe suivante et sous méthodes utilisent des œuvres:Quelqu'un peut-il expliquer comment cela fonctionne?

<?php 
$me = new Person; 
$me->name("Franky")->surname("Chanyau")->phone("+22", "456 789"); 
?> 

Je connais assez solide de la POO, donc je ne veux pas 101. J'ai juste besoin de savoir comment rendre le code ci-dessus possible.

Vive Franky

+0

* (liés) * [Méthode Enchaînement] (http : //stackoverflow.com/search? q = méthode + chaînage + php) – Gordon

+1

Cette technique peut également être utilisée pour implémenter une interface fluide: http://en.wikipedia.org/wiki/Fluent_interface –

+0

@Dennis Haarbrink - Nice. Je n'ai jamais entendu parler de ce terme auparavant. Merci pour le lien. –

Répondre

12

de méthodes enchaînées est possible, par

return $this; 

à la fin de la méthode.

explicités ici: phpandstuff: Method Chaining Plus Magic Setters

Ces méthodes généralement définir une variable d'instance et puis juste retourner ce $.

public function phone($param) { 
    $this->phone = $param; 
    return $this; 
} 
+0

+1 pour l'utilisation du mot-clé chaînage. –

+0

Ok, donc serait-il aussi possible de chaîner la méthode mais au lieu de retourner $ this vous retournez un autre objet que vous avez créé? –

+0

@Franky c'est possible mais à strictement parler Méthode Chaining renvoie l'objet hôte. Une fois que vous commencez à renvoyer différents objets, vous allez dans la direction d'une interface Fluent (pour créer un DSL). Ces deux sont souvent confus. – Gordon

3

méthodes name()surname() et phone() retourner une instance de personne. vous pouvez accomplir cette tâche par

return $this; 

très probablement ces méthodes ressemblent à ceci:

public function name($name) { 
    $this->name = $name; 
    return $this; 
} 
3

comme d'autres ont dit, son interface fluide http://en.wikipedia.org/wiki/Fluent_interface#PHP l'idée de base est qu'un methof d'une classe retourne toujours l'objet lui-même

class Car { 
    private $speed; 
    private $color; 
    private $doors; 

    public function setSpeed($speed){ 
     $this->speed = $speed; 
     return $this; 
    } 

    public function setColor($color) { 
     $this->color = $color; 
     return $this; 
    } 

    public function setDoors($doors) { 
     $this->doors = $doors; 
     return $this; 
    } 
} 

// Fluent interface 
$myCar = new Car(); 
$myCar->setSpeed(100)->setColor('blue')->setDoors(5); 

(via wiki)

+0

Ce n'est pas le cas. Il existe une différence conceptuelle entre * simple * méthode de chaînage et une interface fluide. Méthode Le chaînage, selon la définition de Fowler, renvoie l'objet hôte. Une interface fluide vise à créer un DSL. Une interface fluide peut utiliser des chaînes de méthodes (entre autres techniques), mais une chaîne de méthodes n'est pas une interface fluide. Un exemple d'interface Fluent serait 'Zend_Db_Table':' $ table-> select() -> de ('foo') -> où ('bar = baz') -> assembler(); ' – Gordon

+0

vous avez raison, pas chaque fois que j'utilise la méthode de chaînage son interface fluide mais je n'irais pas jusqu'à dire si c'est ce qu'il veut accomplir une interface fluide ou juste la méthode de chaînage ... – Hannes

0

L'idée est que si nous retournons $ this, nous pouvons enchaîner les appels de la méthode objet. Voici la solution:

<?php 

    class Person 
    { 
     private $strName; 
     private $strSurname; 
     private $ArrPhone = array(); 

     public function name($strName) 
     { 
      $this->strName = $strName; 
      return $this; // returns $this i.e Person 
     } 

     public function surname($strSurname) 
     { 
      $this->strSurname = $strSurname; 
      return $this; // returns $this i.e Person 
     } 

     public function phone() 
     { $this->ArrPhone = func_get_args(); //get arguments as array 
      return $this; // returns $this i.e Person 
     } 

     public function __toString() 
     { 
      return $this->strName." ".$this->strSurname.", ".implode(" ",$this->ArrPhone); 
     } 
    } 

    $me = new Person; 
    echo $me->name("Franky")->surname("Chanyau")->phone("+22", "456 789"); 

?> 
0

réponses correctes, mais pour faire le travail de code que vous devez écrire:

$me = new Person(); 

au lieu de

$me = new Person; 
+1

http://php.net/manual/ fr/language.types.object.php - En fait .. Jetez un oeil à la documentation officielle de php, ils n'utilisent pas() pour instancier un nouvel objet. Vous n'auriez besoin que des crochets pour envoyer des variables à la méthode __construct() de la classe. –

Questions connexes