先簡單粗俗的描述下:
public 表示全局,類內部外部子類都可以訪問;
private表示私有的,只有本類內部可以使用;
protected表示受保護的,只有本類或子類或父類中可以訪問;
再啰嗦的解釋下:
一、
public: 公有類型
在子類中可以通過 self::屬性名(或方法名) 調用public方法或屬性,parent::方法名 調用父類方法
在實例中可以能過 $obj->屬性名(或方法名) 來調用 public類型的方法或屬性
protected: 受保護類型
在子類中可以通過 self::屬性名(或方法名) 調用protected方法或屬性,parent::屬性名(或方法名) 調用父類方法。
在實例中不能通過 $obj->屬性名(或方法名) 來調用 protected類型的方法或屬性
private: 私有類型
該類型的屬性或方法只能在該類中使用,
在該類的實例、子類中、子類的實例中都不能調用私有類型的屬性和方法
二、
self 和parent 的區別
a).在子類中常用到這兩個對像。他們的主要區別在於self可以調用父類中的公有或受保護的屬性,但parent不可以調用
b).self:: 它表示當前類的靜態成員(方法和屬性)與 $this不同,$this是指當前對像
直接上一示例:
<?php //父類 class father{ public function a(){ echo "public function a".PHP_EOL; } private function b(){ echo "private function b".PHP_EOL; } protected function c(){ echo "protected function c".PHP_EOL; } } //子類 class child extends father{ function d(){ parent::a();//調用父類的a方法 } function e(){ parent::c(); //調用父類的c方法 } function f(){ parent::b(); //調用父類的b方法 } } $father=new father(); $father->a(); //輸出 public function a $father->b(); //顯示錯誤 外部無法調用私有的方法 $father->c(); //顯示錯誤 外部無法調用受保護的方法 $chlid=new child(); $chlid->d();//輸出 public function a $chlid->e(); ////輸出 protected function c $chlid->f();//顯示錯誤 無法調用父類private的方法 Uncaught Error: Call to private method father::b() from context 'child'
通過上面實力我們可以看出:
protected 保護模式 只在類本身及派生類中可訪問,那么 這個$chlid->e(); 調用的是 father 的function c(), 也就說 在child 中調用father的c 是可以的. 但如果你直接用child->c(), 那就是不行的. 要通過child的e() 中轉一下 才能調用到father 的c()
再來舉例說明:
<?php class Man { private $name = '周伯通'; protected $money = 3000; public $age = 30; public function say() { echo '我叫',$this->name,'<br />'; echo '我有',$this->money,'元錢<br />'; echo '我今年',$this->age,'歲'; } } class Stu extends Man { private $friend = '小白'; public function talk() { echo '我叫',$this->name,'<br />';//我叫 Notice: Undefined property: Stu::$name in D:\web\mytest\p.php on line 18 echo '我有',$this->money,'元錢<br />'; //我有3000元錢 echo '我今年',$this->age,'歲<br />';//我今年30歲 } } $class = new Stu(); echo $class->age,'<br />'; // 28 echo $class->friend; //出錯:因為類外不能調用private echo $class->money; //出錯:因為類外不能調用protected屬性 $class->talk();
以上輸出:
30 <br /> <br /> <b>Fatal error</b>: Uncaught Error: Cannot access private property Stu::$friend in D:\web\mytest\p.php:26 Stack trace: #0 {main} thrown in <b>D:\web\mytest\p.php</b> on line <b>26</b> <br />
分析原因: Undefined property: Stu::$name 這是說明:stu對象 沒有name屬性 但上面不是說私有的不是可以繼承嗎? 是可以繼承過來,但系統有標記,標記其為父類層面的私有屬性. 因此無權調用,導致此錯發生. 可以分析出: protected 可以在 子類內訪問
protected能在子類訪問,本類內能否訪問? 答:當然可以