2012-08-12 101 views
0

我有模型類,和模型_什麼類。 Model_Something有靜態屬性(表名)。PHP ::如何從擴展類調用靜態方法(或屬性)?

我要訪問Model_Something static property from Model class。 但它試圖找到它在模式類,並給我的異常:

ErrorException [ Fatal Error ]: 
Access to undeclared static property: Model::$_collection_name 

我嘗試訪問它以這樣的方式

self::$some_property; 

如何獲得呢?

+0

請包括'Model_Something的聲明'和'Model'類。哪個類擴展了哪個? – 2012-08-12 11:07:35

+0

你可能想檢查[這個問題](http://stackoverflow.com/questions/1349637/correct-implementation-of-virtual-functions-in-php) – 2012-08-12 11:13:53

+0

如果父類需要訪問子類的屬性,那麼該屬性應該可用於所有的子類。爲什麼不把它移到父類呢?這也有一個好處,即父母不需要知道孩子的實施細節。 – Arjan 2012-08-12 11:21:54

回答

3

你不應該訪問一個不存在的類的屬性,並依賴它存在於孩子中。家長不能/不應該知道孩子是做什麼的,它必須是相反的。因此,首先在父級中聲明屬性,以便父級可以在任何情況下訪問它。然後孩子可以覆蓋該房產的價值。爲了確保您始終訪問執行類的屬性,你需要後期靜態綁定,您可以通過使用static,而不是self得到:

static::$some_property; 

http://php.net/manual/en/language.oop5.late-static-bindings.php

+0

如同在現實生活中,父母不應該依賴它的孩子;) – 2012-08-12 11:28:04

+2

因爲你知道他們只會用完,並讓他們在他們轉身的那一刻18.;) – deceze 2012-08-12 11:29:27

+0

我使用了static :: $ collection_name,它可以工作。謝謝 – 2012-08-12 13:34:47

-1

parent :: $ some_property;它會使你的代碼更不可靠,就像你改變你的類名一樣,如果你使用類名,你也必須在這裏改變。

+0

我想從父母代碼 – 2012-08-12 11:06:41

+0

訪問CHILD屬性比** self :: $ some_property; ** else ** Class_name :: $ some_property; **如果該屬性被子類覆蓋。假設你有類a(帶有屬性x),類b(帶有屬性x)擴展了類a和類c(帶有屬性x)擴展了類b,並且你想訪問類c的屬性x比使用self :: $ a和你想訪問b類的財產x比使用b :: $ a – 2012-08-12 11:26:59

相關問題