有没有办法检查属性是否已超载?

时间:2012-07-13 08:34:13

标签: php reflection overloading

我有一个属性,用于定义在类上使用的一组字段。

最后,当扩展类时,PHP允许您重新定义此属性,但我不想允许这样做,因为父级上的可用字段可能会在重载时丢失。

这是一个例子:

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

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

我可以在施工时检查房产是否超载?也许通过使用反射方法?

1 个答案:

答案 0 :(得分:1)

如果您不想允许扩展类重新定义属性,请将该属性定义为private。私有属性只能在定义类中访问,并且扩展父类的类中属性的任何重新定义都不会更改父类访问的值。

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"
}

..因为第一次访问将读取父类中的属性(不能在继承该值的类中重写),并且扩展器仍然能够获取任何本地属性的值,而不管父类中的命名。