2011-10-01 45 views
1

我知道$something->function();正在調用一個類中的函數,但$something->somethingelse->function();是什麼意思?類中使用的PHP類?

+1

你確定它的'$東西 - > $ somethingelse->函數();'而不是'$ something-> somethingelse->函數();'或'$ something-> somethingelse() - > function();'? – Shef

+1

http://php.net/oop5 – salathe

+0

@shef謝謝.... – Vish

回答

1

我假設你的意思是$something->somethingelse->function()

這意味着名爲$somethingelse$something的屬性是另一個具有方法function()的對象。

$something = new Class1(); 
$something->somethingelse = new Class2(); // Class2 has the "function()" method 


// Now I can call... 
$something->somethingelse->function(); 
+0

哦,這是什麼目的呢? – Vish

+0

@user你是什麼意思? –

+0

@ user658911目的是在該類內部具有該對象的功能。它被稱爲[依賴注入](http://www.potstuck.com/2009/01/08/php-dependency-injection/)模式。 – Shef

0

類實例美元的東西包含一個名爲$ somethingelse實例變量,這也是一個對象(類的實例)。

這被認爲是不好的做法(請參閱Law of Demeter on Wikipedia)。

彼得·範·Rooijen的Law of Demeter is on c2.com的一個很好的解釋是:

你可以自己玩。

您可以用自己玩玩具(但你不能把他們分開),

您可以用被給了你,玩玩具。

你可以玩你自己製作的玩具。

以純英文:

你的方法可以調用其他同類方法直接

你的方法可以調用直接自身的字段的方法(但不是在字段的字段)

當您的方法接受參數時,您的方法可以直接調用這些參數的方法。

當您的方法創建本地對象時,該方法可以調用本地對象上的方法。

人不應該調用全局對象的方法

一個人不應該有消息的鏈a.getB()。GETC()。DoSomething的()中的一些類除了班級以外。

另一個有趣的閱讀是對Law of Demeter Revisited不太嚴格的方法。

+1

我不同意這是一般不好的做法。諸如[依賴注入](http://en.wikipedia.org/wiki/Dependency_Injection)之類的模式在沒有它的情況下無法工作 –

+0

依賴注入雖然是關於在$ something中注入$ somethingelse的實例,而無需使用它創建它新的內部$東西(這將鞏固依賴)。這不是揭示這些依賴關係,應該是什麼應該是一個班級的「私人部分」。你只能用setter寫它。 – stivlo

1

你可以說這是這樣的:

class foo { 
    public $bar; 
} 

class bar { 
    public $baz; 
} 

class baz { 
    function blip() { echo "Hello World"; } 
} 

$foo = new foo(); 
$foo->bar = new bar(); // setting bar to new object 
$foo->bar->baz = new baz(); // setting baz to new object 
$foo->bar->baz->blip(); // calling the blip function 
+0

我改變了它,所以它的作品完全一樣。我沒有意識到var已被棄用 - 謝謝 –