我有一个属性,用于定义在类上使用的一组字段。
最后,当扩展类时,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 :(得分: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"
}
..因为第一次访问将读取父类中的属性(不能在继承该值的类中重写),并且扩展器仍然能够获取任何本地属性的值,而不管父类中的命名。