好吧, 我一直在瀏覽一些PHP源代碼,需要知道下面的類和方法的子如何使用作品:任何人都可以解釋這是如何工作的?
<?php
$me = new Person;
$me->name("Franky")->surname("Chanyau")->phone("+22", "456 789");
?>
我有OOP的相當紮實的知識,所以我不希望有一個101。我只需要知道如何使上面的代碼成爲可能。
乾杯 永邦
好吧, 我一直在瀏覽一些PHP源代碼,需要知道下面的類和方法的子如何使用作品:任何人都可以解釋這是如何工作的?
<?php
$me = new Person;
$me->name("Franky")->surname("Chanyau")->phone("+22", "456 789");
?>
我有OOP的相當紮實的知識,所以我不希望有一個101。我只需要知道如何使上面的代碼成爲可能。
乾杯 永邦
方法鏈是可能的,通過
return $this;
:您可以通過
return $this;
最有可能這些方法看起來是這樣做到這一點。
解釋這裏: phpandstuff: Method Chaining Plus Magic Setters
這些方法通常設置一個實例變量,然後就返回$此。
public function phone($param) {
$this->phone = $param;
return $this;
}
使用關鍵字鏈接+1。 – 2010-09-22 07:19:28
好吧,那麼也可以使用方法鏈,但不是返回$ this,而是返回您創建的另一個對象? – 2010-09-22 07:37:49
@Franky這是可能的,但嚴格來說,方法鏈接返回主機對象。一旦你開始返回不同的對象,你將進入流暢接口(創建一個DSL)的方向。這兩個人經常感到困惑。 – Gordon 2010-09-22 07:41:43
方法name()
surname()
和phone()
返回Person的一個實例。在方法結束
public function name($name) {
$this->name = $name;
return $this;
}
它被稱爲方法鏈。基本上每個類函數都會返回對象本身($this
),以便用戶可以在返回的對象上調用更多的函數。
public function name() {
//other stuff...
return $this;
}
http://www.talkphp.com/advanced-php-programming/1163-php5-method-chaining.html
像一些人說,它是一個流體界面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)
不是。 * 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
你是對的,不是每次我使用方法鏈接它的流體界面,但我不會說如果這就是他想要完成一個流體接口或只是方法鏈接... – Hannes 2010-09-22 14:09:02
這個想法是,如果我們返回$ 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");
?>
正確的答案,但以使代碼工作,你應該寫:
$me = new Person();
,而不是
$me = new Person;
http://php.net/manual/ en/language.types.object.php - 其實..看看官方的php文檔,他們不使用()來實例化一個新的對象。您只需要括號就可以將變量發送到類的__construct()方法。 – 2010-09-23 06:08:47
*(相關)* [方法鏈接](HTTP ://stackoverflow.com/search?q = method + chaining + php) – Gordon 2010-09-22 07:18:20
這種技術也可以用來實現Fluent接口:http://en.wikipedia.org/wiki/Fluent_interface – 2010-09-22 07:27:59
@丹尼斯哈爾布林克 - 尼斯。我從來沒有聽說過這個詞。感謝您的鏈接。 – 2010-09-22 07:34:21