我有2个A和B类扩展A. A有一个公共属性,我希望在B的实例上无法访问属性。我试着更好地解释一下:
class A
{
public $prop;
}
class B extends A
{
...
}
$instance=new B;
$instance->prop; //This must throw an error like "Undefined property prop"
我尝试使用final
关键字,但它仅适用于不属于属性的方法。我还尝试在B上设置与private
相同的属性,但PHP不允许将访问级别从公共更改为私有或受保护。
也许有一个简单的解决方案来解决这个问题,但我找不到它,所以你知道这样做的方法吗?
答案 0 :(得分:3)
只需将public $prop;
更改为private $prop;
即可将{prop public
改为通过各种可能的方式使其可访问,但将其设为private
会使其在类中可访问仅
答案 1 :(得分:1)
嗯。棘手!
我想到的唯一想法是从一开始就将$prop
设为私有,并使用magic getter and setter functions来控制访问权限。您必须将访问信息存储在单独的数组中,然后返回正确的值,或在getter函数中抛出致命错误。
答案 2 :(得分:1)
class A {
protected $_prop;
public function __get($key) {
if ($key=='prop') {
return $this->_prop;
}
}
public function __set($key, $value) {
if ($key=='prop') {
return $this->_prop = $value;
}
}
}
class B extends A {
public function __get($key) {
}
public function __set($key, $value) {
}
// how you can use it
public function foo() {
echo $this->_prop;
}
}