2010-09-30 251 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