2011-06-22 130 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