2010-09-22 149 views
5

好吧, 我一直在瀏覽一些PHP源代碼,需要知道下面的類和方法的子如何使用作品:任何人都可以解釋這是如何工作的?

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

我有OOP的相當紮實的知識,所以我不希望有一個101。我只需要知道如何使上面的代碼成爲可能。

乾杯 永邦

+0

*(相關)* [方法鏈接](HTTP ://stackoverflow.com/search?q = method + chaining + php) – Gordon 2010-09-22 07:18:20

+1

這種技術也可以用來實現Fluent接口:http://en.wikipedia.org/wiki/Fluent_interface – 2010-09-22 07:27:59

+0

@丹尼斯哈爾布林克 - 尼斯。我從來沒有聽說過這個詞。感謝您的鏈接。 – 2010-09-22 07:34:21

回答

12

方法鏈是可能的,通過

return $this; 

:您可以通過

return $this; 

最有可能這些方法看起來是這樣做到這一點。

解釋這裏: phpandstuff: Method Chaining Plus Magic Setters

這些方法通常設置一個實例變量,然後就返回$此。

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

使用關鍵字鏈接+1。 – 2010-09-22 07:19:28

+0

好吧,那麼也可以使用方法鏈,但不是返回$ this,而是返回您創建的另一個對象? – 2010-09-22 07:37:49

+0

@Franky這是可能的,但嚴格來說,方法鏈接返回主機對象。一旦你開始返回不同的對象,你將進入流暢接口(創建一個DSL)的方向。這兩個人經常感到困惑。 – Gordon 2010-09-22 07:41:43

3

方法name()surname()phone()返回Person的一個實例。在方法結束

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

像一些人說,它是一個流體界面http://en.wikipedia.org/wiki/Fluent_interface#PHP的基本思想是類的methof總是返回對象本身

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); 

(通過wiki)

+0

不是。 * mere *方法鏈接和Fluent接口之間存在概念上的區別。按照Fowler的定義,方法鏈接返回主機對象。 Fluent接口旨在創建一個DSL。 Fluent接口可以使用方法鏈(以及其他技術),但方法鏈不是Fluent接口。 Fluent接口的一個例子是'Zend_Db_Table':''table-> select() - > from('foo') - > where('bar = baz') - > assemble();' – Gordon 2010-09-22 08:19:08

+0

你是對的,不是每次我使用方法鏈接它的流體界面,但我不會說如果這就是他想要完成一個流體接口或只是方法鏈接... – Hannes 2010-09-22 14:09:02

0

這個想法是,如果我們返回$ this,那麼我們可以將對象方法調用鏈接在一起。這裏的解決方案:

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

正確的答案,但以使代碼工作,你應該寫:

$me = new Person(); 

,而不是

$me = new Person; 
+1

http://php.net/manual/ en/language.types.object.php - 其實..看看官方的php文檔,他們不使用()來實例化一個新的對象。您只需要括號就可以將變量發送到類的__construct()方法。 – 2010-09-23 06:08:47

相關問題