2012-04-30 245 views
3

我已經在一些圖書館這樣的事情見過?PHP OOP多重呼叫

我想:

class greeting 
{ 
    public function hi() 
    { 
     public function howAreYou() 
     { 
      echo 'How are you?'; 
     } 
    } 
} 
$greet = new greeting; 
$greet->hi()->howAreYou(); 

但我認爲這不是那麼好,我會更好地使用這樣的延伸,但我不知道。 Thx爲您的建議。

回答

3

getResponse()正在返回一個具有setRedirect()方法的類實例。

例子:

class Foo 
{ 
    public function getResponse() 
    { 
     $redirect = new Bar(); 
     return $redirect; 
    } 
} 

class Bar 
{ 
    public function setRedirect($returnUrl) 
    { 
     // do something 
    } 
} 

$foo = new Foo(); 

$foo->getResponse()->setRedirect("returnUrl"); 
2

所有你需要做的就是在每一個功能非常末端返回自我。

所以,你的例子是像>

class greeting 
{ 
    public function hi() 
    { 
     echo "Hi"; 

     return $this; 
    } 

    public function howAreYou() 
    { 
     echo 'How are you?'; 

     return $this; 
    } 
} 

$greet = new greeting; 
$greet->hi()->howAreYou(); 

甚至:

$greet->hi()->howAreYou()->hi()->howAreYou(); 
+3

你一直在尋找的關鍵詞是**方法鏈接**。 :-) – YMMD

+0

我認爲你的意思是'$ this',而不是'self'(你的代碼示例是正確的)。 – Piskvor

+0

@YMMD是的,我在我現在找不到的另一個答案中提交了我的答案後,我讀了它(有人刪除它?)。 無論如何,我總是低理論,我很實際... ... :-) – shadyyx

1

鏈接的方法是不一樣的方法中聲明功能......其實後者會吐的錯誤(不是函數聲明,而是你調用它的方式)。爲了鏈的方法,只是它返回的對象本身:

Class chainableObject 
{ 
    public $name=null; 
    public function __construct($name='') 
    { 
     $this->name=$name; 
     return $this; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
     return $this;//makes chainable 
    } 

    public function greet() 
    { 
     echo 'Hello, '.$this->name; 
     return $this; 
    } 
} 

$chain = new chainableObject('Frank')->greet();//outputs: Hello, frank 

的解釋:所有方法返回的實例本身,所以基本上,這樣寫的[名稱爲創建對象的代碼段的最後一行: Frank] =>調用此方法的返回值的方法。由於返回值是$this,具有迎接方法的對象,這是會發生什麼......輕鬆,以獲得更多信息:只是谷歌PHP的方法鏈接

1
class stutter{ 
     public function a(){ 
     echo 'h'; 
     return $this; 
    } 
     public function b(){ 
     echo 'hello world!'; 
    } 
    } 

$ VAR =新的口吃(); var-> a() - > b();

輸出是:

^h的hello world