class A{ public function run() { $this->say(); }}class B extends A{ protected function say() { echo 'B-say'; }}$b = new B();$b->run();//結果 輸出B-say
如果把say換成private就不行了
報錯 PHP Fatal error: Call to private method B::say() from context 'A'
意思是A訪問不了B的私人方法。那為什麼protected就行呢,protected不應該也不行的嗎?A是B的父類並不是子類。
回複內容:
class A{ public function run() { $this->say(); }}class B extends A{ protected function say() { echo 'B-say'; }}$b = new B();$b->run();//結果 輸出B-say
如果把say換成private就不行了
報錯 PHP Fatal error: Call to private method B::say() from context 'A'
意思是A訪問不了B的私人方法。那為什麼protected就行呢,protected不應該也不行的嗎?A是B的父類並不是子類。
自己找到問題所在了。父類可以訪問子類 protected 受保護的方法
this代表的是對象本身。因為B繼承A,所以B也有了A的所有方法和屬性。代碼不就變成這樣了嗎。
class B extends A{ protected function say() { echo 'B-say'; } public function run() { $this->say(); }}
這樣執行的結果肯定也是B-say;
如果say方法的修飾詞換成是private的話,那肯定是不可以在外部調用say方法的,所以會報錯。
存取修飾詞
private 只能在本類中訪問,繼承類之間不可訪問
protected 繼承類之間是可以訪問的,類外不可訪問
這就是private 和 protect的區別
覺得挺有意思的,分析了一下,看下這裡:
http://www.chengxiaobai.cn/PHP/the-parent-class-calls-the-sub-class-method-in-php.html