2012-07-13 162 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

相关问题