2010-09-22 17 views
5

Ok, Ich habe einige PHP-Quellcode gegrast und müssen wissen, wie die folgende Klasse und Unter Methoden Arbeiten verwenden:Kann mir jemand erklären, wie das funktioniert?

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

ich ziemlich solide Kenntnisse der OOP haben, so will ich nicht eine 101. Ich muss nur wissen, wie der obige Code möglich ist.

Prost Franky

+0

* (bezogen) * [Methode Chaining] (http : //stackoverflow.com/search? q = method + chaining + php) – Gordon

+1

Diese Technik kann auch verwendet werden, um eine Fluent-Schnittstelle zu implementieren: http://en.wikipedia.org/wiki/Fluent_interface –

+0

@Dennis Haarbrink - Nizza. Ich habe noch nie zuvor von diesem Begriff gehört. Danke für den Link. –

Antwort

12

Methode Chaining möglich ist, durch

return $this; 

am Ende des Verfahrens.

hier Erklärt: phpandstuff: Method Chaining Plus Magic Setters

Diese Methoden in der Regel eine Instanz Variable gesetzt und dann nur $ diese zurück.

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

+1 für die Verwendung der Keyword-Verkettung. –

+0

Ok, also wäre es auch möglich, die Methode zu verketten, aber anstatt $ zurückzugeben, gibt man ein anderes Objekt zurück, das du erstellt hast? –

+0

@Franky das ist möglich, aber streng genommen Methode Verkettung gibt das Host-Objekt zurück. Sobald Sie beginnen, verschiedene Objekte zurückzugeben, gehen Sie in die Richtung einer Fluent-Schnittstelle (um eine DSL zu erstellen). Diese beiden sind oft verwirrt. – Gordon

3

Methoden name()surname() und phone() eine Instanz von Person zurück. Sie können dies zu erreichen, indem

return $this; 

höchstwahrscheinlich diese Verfahren wie folgt aussehen:

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

wie einige andere gesagt, es ist eine Flüssigkeit Schnittstelle http://en.wikipedia.org/wiki/Fluent_interface#PHP Die Grundidee ist, dass ein methof einer Klasse immer gibt das Objekt selbst

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

nicht zurückgibt. Es gibt einen konzeptionellen Unterschied zwischen * nur * Method Chaining und einem fließenden Interface. Method Chaining, nach Fowlers Definition, gibt das Host-Objekt zurück. Ein Fluent-Interface zielt darauf ab, eine DSL zu schaffen. Eine fließende Schnittstelle kann (unter anderen Techniken) Methodenketten verwenden, aber eine Methodenkette ist keine fließende Schnittstelle. Ein Beispiel für eine fließende Schnittstelle wäre 'Zend_Db_Table':' $ table-> select() -> from ('foo') -> where ('bar = baz') -> assemble(); ' – Gordon

+0

Sie haben recht, Nicht jedes Mal, wenn ich Method Chaining verwende, ist es eine flüssige Schnittstelle, aber ich würde nicht so weit gehen, um zu sagen, ob das, was er erreichen möchte, eine flüssige Schnittstelle oder nur Method Chaining ... – Hannes

0

Die Idee ist, wenn wir $ zurückgeben, dann können wir die Objektmethodenaufrufe zusammenketten. Hier ist die Lösung:

<?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

Richtige Antworten, aber den Code Arbeit machen Sie schreiben sollte:

$me = new Person(); 

statt

$me = new Person; 
+1

http://php.net/manual/ de/language.types.object.php - Eigentlich .. Werfen Sie einen Blick auf offizielle PHP-Dokumentation, sie verwenden nicht() für die Instanziierung eines neuen Objekts. Sie benötigen nur die Klammern, um Variablen an die Methode __construct() der Klasse zu senden. –

Verwandte Themen