先簡單粗俗的描述下:
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 = '馬dayday';
protected $money = 3000;
public $age = 24;
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();
以上輸出:
<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能在子類訪問,本類內能否訪問? 答:當然可以
有好的學習鏈接就先碼下來,好好理解,吃透!貴在堅持