2011-06-22 83 views
2

所以我想知道是否有方法链,当初始方法是一个静态函数。这里是我的意思是:PHP方法链接

class foo 
    { 
     public static function a() 
     { 
      $foo = new foo; 
      return $foo->bar(); 
     } 

     public function bar() 
     { 
      return $this; 
     } 

     public function b() 
     { 
      return 1; 
     } 
    } 

    print foo::a()->b(); 

编辑 print foo::a()->b();没有print foo:a()->b();

+2

你不应该在这个代码的任何地方获取数组,我不认为这是你正在使用的实际代码。此外,你不调用函数'bar()',你正在调用属性'bar'。这个工作的演示:http://codepad.org/5kPLusX8 –

+0

这只是我的一个错字。不,这不是实际的代码。只是一个概念性问题 – grep

+0

有几个拼写错误,但这不是我所指的。在函数'a()'中,你没有返回'bar()',你正在返回'bar'。测试中的某些内容已关闭,您应该花时间至少分享您所需的代码或实际可用于展示问题的内容。 –

回答

1

静态方法或其他方法,只要方法是返回一个对象自己或其他方法,可以链接方法,使用您尝试相同的方法。

class foo { 
    public function __construct() { 
    } 
    public function create() { 
     // create something; 
     return $this; 
    } 
    public function performSomethingElse() { 
     // perform something 
     return $this; 
    } 
} 
$object = new foo; 

$object -> create() -> performSomethingElse(); 
0

此行

print foo:a(); 

应该

print foo::a(); 

,你将无法返回$this在 它需要一个静态方法来进行第一次实例:

$foo = new Foo(); 
print $foo->a()->b(); 
+0

更新了静态函数。原本是$ foo-> bar(); – grep

+0

是的,我看到你的更新,'$ foo-> bar();'和'$ foo :: bar()'之间有区别。在第二个中你不能返回$ this。这就是为什么我使用'新Foo();' – Ibu

+0

@Headspin有解决您的问题? – Ibu

0

那种只有一个答案,而有些特质:
不过,我想提醒你你的对象伴有工厂过程改为:

class foo { .... } 

function foo() { return new foo; } 

这可能会消除您的一些困惑。它甚至看起来通过避免静态和对象方法调用的组合更好一点:

foo()->bar()->b(); 

它基本上是外化的静态函数。而你的对象只实现返回$ this的可链式方法,或实际结果。

+0

虽然我不得不实例化类是否正确? – grep

+1

这是单独功能的目的。它实例化一个新的foo;' – mario