PHP中private、public、protected的區別詳解

先簡單粗俗的描述下:
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能在子類訪問,本類內能否訪問? 答:當然可以

有好的學習鏈接就先碼下來,好好理解,吃透!貴在堅持

http://www.cnblogs.com/phpper/p/8976304.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章