2012-04-30 51 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