2010-09-30 149 views
1

我有2个类A和B扩展A. A有一个公共属性,我希望在B的实例中属性不可访问。我试着更好地解释:PHP使类继承可继承

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不允许将访问级别从公共改为私有或受保护。

也许有一个简单的解决方案,但我找不到它,所以你知道一种方法来做到这一点?

+1

你扩展别人的课程?为什么你不能从源头上解决问题? – erisco 2010-09-30 13:25:53

+1

为什么你想声明一个属性是公共的(即最广泛的可见性),然后拒绝其访问后裔类? – 2010-09-30 13:26:32

+0

我不想让私人公共财产,我希望B不会继承它。我改变了访问级别只是为了找到一个好的解决方案,但它不起作用 – mck89 2010-09-30 13:28:21

回答

1

使用magic methods

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; 
    } 
} 
1

嗯。整蛊!

想到的唯一想法是使$prop私人从一开始,并使用magic getter and setter functions来控制访问。您必须将访问信息存储在单独的数组中,然后返回正确的值,或者在getter函数中引发致命错误。

3

通过简单地做$道具public你正在使一切可能的方式访问,但使其private将使它在类内访问更改public $prop;private $prop;

+0

我正在寻找一种方法来保存基类上的属性,但也许没有其他办法。 – mck89 2010-09-30 13:27:10