2012-07-13 242 views
-1

我有,我用它來定義一組是在類上使用的字段的屬性。有沒有辦法檢查一個屬性是否超載?

最終,當類擴展,PHP可以讓你重新定義這個屬性,但我不希望允許,因爲父母可用字段可能超載會丟失。

這是一個例子:

class A { 
    protected $_fields = array('a', 'b'); 
} 

class B extends A { 
    protected $_fields = array('c', 'd'); // I'm loosing 'a' and 'b' fields 
} 

我可以檢查在施工時,如果財產已經超載?也許通過使用反射方法?

+0

你嘗試在父類用魔術方法__set()防止超載? – Destralak 2012-07-13 08:41:29

+1

是的,你可以* *找出答案在構造函數中使用反射,但構造也可以被覆蓋。所以如果你想阻止某人重寫它,那麼這有點不實際。你不能讓人不敢拍自己的腳。我會理解,如果你想這樣做*自動合併*兩個獲得超集... – deceze 2012-07-13 08:44:19

+0

@deceze我怎麼能找出使用反射? – 2012-07-13 09:13:18

回答

1

如果你不想讓擴展類重新定義屬性,定義屬性爲私有。私有屬性只能在定義的類內部訪問,並且對擴展父類的類中的屬性進行任何重新定義都不會更改父類訪問的值。

class A { 
    private $_fields = array('a', 'b'); 

    function foo() { var_dump($this->_fields); } 
} 

class B extends A { 
    protected $_fields = array('c', 'd'); // I'm loosing 'a' and 'b' fields 

    function foo2() { var_dump($this->_fields); } 
} 

$b = new B(); 
$b->foo(); 
$b->foo2(); 

將輸出:

array(2) { 
    [0]=> 
    string(1) "a" 
    [1]=> 
    string(1) "b" 
} 
array(2) { 
    [0]=> 
    string(1) "c" 
    [1]=> 
    string(1) "d" 
} 

..由於第一接入將讀取在父類中的屬性(它不能在類重寫繼承值),並且將擴仍然能夠獲得任何本地財產的價值,而不管父類中的命名如何。

+0

謝謝!我不知道這種行爲。事實上,我認爲你不能這樣做:將一個屬性定義爲私有屬性,並將其重新聲明在一個孩子的類上。 – 2012-07-13 08:59:06

相關問題