PHP物件導向之3種資料存取方式詳解(程式碼範例)

2020-07-16 10:05:51

本文目標

掌握PHP中資料存取的3種方式的定義和作用

1、public

2、protected

3、private

(一)、資料存取的3種方式

1、Public:公有的類成員

可以在任何地方存取,具體可以被哪些存取了:

● 定義該類的類(自身)

● 該類的子類

● 其他類

2、Protected:受保護的類成員

● 定義該類的類(自身)

● 該類的子類

3、Private:私有的類成員

● 只有自身才可以存取

總結:從上到下約束能力是越來越強的

單純從以上的文字描述,我們理解起來還是有點費力的,那麼還是按照理論+實踐的方式來進行理解,那麼接下來我們就通過具體的程式碼來理解這3種資料存取的方式在PHP中到底是如何實現的,到底它們各自的特點是什麼,最後來體會一下它們的約束能力到底又是怎樣。

(二)具體程式碼

說明:為了讓大家能更好的理解物件導向,所以寫文章的時候,我也是盡量遵循一定的規則,由淺到深,由易到難,所以我寫的每篇文章都是和上篇文章有一定的關聯,比如以下的程式碼案例,我又是在上篇文章的程式碼上進行的拓展和延伸。

案例一:知道public的定義,然後證明它可以在3個地方都可以存取(1.在自己定義的類中,2.在子類中 3.在外部)

<?php

//定義 「人」 類
class Human{
    public $name = "";//姓名 
    public $height = "";//身高
    public $weight = "";//體重

    public function eat($food){
        echo $this->name."在吃".$food."<br/>";
    }
}
//女主播
class Anchors extends Human{
    public $name = "";
    public $stageName = "";
    public function __construct( $name,$stageName ){
        $this->name = $name;
        $this->stageName = $stageName;
    }
    public function singing(){
        echo "我是女主播,我會唱歌<br/>";
    }
  
}
// Nba球員類
 class NbaPlayer extends Human{
   //因為父類別已經有了,所以就不需要再寫了,通過extends來實現
    // public $name  = "";//姓名
    // public $height = "";//身高
    // public $weight = "";//體重

    public $team = "";//團隊
    public $playerName = "";//球員號碼

    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        echo "建構函式執行了,當前物件是{$this->name}<br/>";
    }
    
   
   //跑步
    public function run(){
        echo "跑步中<br/>";
    }
    //跳躍
    public function jump(){
        echo "跳躍<br/>";
    }
    //運球
    public function dribble(){
        echo "運球<br/>";
    } 
    //傳球
    public function pass(){
        echo "傳球<br/>";
    }
    //投籃
    public function shoot(){
        echo "投籃<br/>";
    }
    //扣籃
    public function dunk(){
        echo "扣籃<br/>";
    }
 }

 //資料存取測試
//public 測試
//1、測試在類的外部可以存取
 //建立喬丹物件
 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23");
 //輸出喬丹物件
 echo "名稱= ".$jordon->name."<br/>";//結果能夠輸出來,說明在外部是可以存取Public類成員的

//2、測試在類的自身裡面可以存取
//例子:比如建構函式裡,我們可以直接通過$this->team

//3、測試是否可以子類中可以存取
//例子:比如父類別中定義的name 一樣可以在子類(NbaPlayer)的建構函式中直接存取

?>

執行效果如下:

3.png

案例二:知道protected的定義,然後證明它可以在2個地方都可以存取(1.在自己定義的類中,2.在子類中 )

<?php
//定義「人」類
class Human{
    public $name = "";//姓名
    public $height = "";//身高
    public $weight = "";//體重

    protected $addr = "長沙";//受保護的類
   
    public function eat($food){
        echo $this->name."在吃".$food."<br/>";
    }
    //測試protected類成員是否可以在自身類中可以存取
    public function getAddrInHuman(){
        echo "Human 自身類中的add=".$this->addr."<br/>";
    }
}
//女主播
class Anchors extends Human{
    public $name = "";
    public $stageName = "";
    public function __construct( $name,$stageName ){
        $this->name = $name;
        $this->stageName = $stageName;
    }
    public function singing(){
        echo "我是女主播,我會唱歌<br/>";
    }
    //重寫方法eat
    public function  eat($food){
        echo "我是女主播,我是邊唱歌邊吃{$food}<br/>";
    }
}
 class NbaPlayer extends Human{
   //因為父類別已經有了,所以就不需要再寫了,通過extends來實現
    // public $name  = "";//姓名
    // public $height = "";//身高
    // public $weight = "";//體重

    public $team = "";//團隊
    public $playerName = "";//球員號碼

    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        echo "建構函式執行了,當前物件是{$this->name}<br/>";
    }
    
    //測試protected類成員是否可以在子類中可以存取
    public function getAddrInNbaPlayer(){
        echo "在NbaPlayer子類中addr=".$this->addr."<br/>";
    }
 }

 //建立喬丹物件
 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23");

 //資料存取測試
 //protected測試
 //1、測試是否可以在自身類中可以存取
 $jordon->getAddrInHuman();//結果OK,確實是可以存取
 //2.測試是否可以在子類中存取
 $jordon->getAddrInNbaPlayer();//結果OK,確實也是可以存取
 //3.測試是否可以被外部存取
 echo "在類外部存取addr=".$jordon->addr."<br/>";//結果報錯,說明不行

?>

執行效果如下:

2.png


案例三:知道private的定義,然後證明它只能在1個地方可以存取(1.在自己定義的類中)

<?php
//定義「人」類
class Human{
    public $name = "";//姓名
    public $height = "";//身高
    public $weight = "";//體重

    private $isHungry = true;//測試私有變數是否可以在子類中存取
  
    //為了讓外部可以存取private類成員
    public function getPrivateInfo(){
        return "private 變數 isHungry=".$this->isHungry."<br/>";
    }
}
//女主播
class Anchors extends Human{
    public $name = "";
    public $stageName = "";
    public function __construct( $name,$stageName ){
        $this->name = $name;
        $this->stageName = $stageName;
    }
    public function singing(){
        echo "我是女主播,我會唱歌<br/>";
    }
    //重寫方法eat
    public function  eat($food){
        echo "我是女主播,我是邊唱歌邊吃{$food}<br/>";
    }
}
 class NbaPlayer extends Human{
   //因為父類別已經有了,所以就不需要再寫了,通過extends來實現
    // public $name  = "";//姓名
    // public $height = "";//身高
    // public $weight = "";//體重

    public $team = "";//團隊
    public $playerName = "";//球員號碼

    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        // echo "建構函式執行了,當前物件是{$this->name}<br/>";
    }
    //測試private類成員是否可以在子類中存取
    public function getIsHungryInNbaPlayer(){
        echo "在NbaPlayer子類中isHungry=".$this->isHungry."<br/>";
    }
 }
 
 //建立喬丹物件
 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23");

 //資料存取測試
 //private測試
 //1.測試私有變數能否被外部存取
 echo "私有變數isHungry =".$jordon->isHungry ."<br/>";//結果不能存取,說明private變數不能被子類存取
 //測試私有變數能否在定義的類的內部存取
 echo $jordon->getPrivateInfo();//結果Ok,說明可以 
//測試私有變數是否可以在子類中存取
$jordon->getIsHungryInNbaPlayer();//結果報錯,說明也不能在子類中存取

?>

執行效果如下:

5.png

總結:

1、Public:公有的類成員

可以在任何地方存取,具體可以被哪些存取了:

● 定義該類的類(自身)

● 該類的子類

● 其他類

2、Protected:受保護的類成員

● 可以被其自身及其子類存取

3、Private:私有的類成員

● 只有自身才可以存取

4.為了讓外部可以存取private類成員,我們可以通過在類中定義一個public方法,然後在public方法中返回private類成員

好,到了這裡,想必大家對資料存取應該有了一個比較清晰的認識,那我們現在來學以致用,用我們學到的這個知識來解決以下的問題,先自己思考一下怎麼做,然後再看答案

問題:NBA球員一般都不想讓其他人知道自己的真實姓名,比如說我明明是40歲,但是我就想讓別人以為是38歲

思考中.......................

答案揭曉:

程式碼如下:

<?php

class Human{
    public $name = "";//姓名
    public $height = "";//身高
    public $weight = "";//體重

}
//女主播
class Anchors extends Human{
    public $name = "";
    public $stageName = "";
    public function __construct( $name,$stageName ){
        $this->name = $name;
        $this->stageName = $stageName;
    }
    public function singing(){
        echo "我是女主播,我會唱歌<br/>";
    }
    //重寫方法eat
    public function  eat($food){
        echo "我是女主播,我是邊唱歌邊吃{$food}<br/>";
    }
}
 class NbaPlayer extends Human{
   //因為父類別已經有了,所以就不需要再寫了,通過extends來實現
    // public $name  = "";//姓名
    // public $height = "";//身高
    // public $weight = "";//體重

    public $team = "";//團隊
    public $playerName = "";//球員號碼

     //資料存取
     private $age = "40";
     //end

    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        echo "建構函式執行了,當前物件是{$this->name}<br/>";
    }
    
   
   //跑步
    public function run(){
        echo "跑步中<br/>";
    }
    //跳躍
    public function jump(){
        echo "跳躍<br/>";
    }
    //運球
    public function dribble(){
        echo "運球<br/>";
    } 
    //傳球
    public function pass(){
        echo "傳球<br/>";
    }
    //投籃
    public function shoot(){
        echo "投籃<br/>";
    }
    //扣籃
    public function dunk(){
        echo "扣籃<br/>";
    }
  
    //資料存取 
    public function getAge(){
        // echo $this->name."的age=".$this->age."<br/>";
        //既然能夠在自身類中獲取到年齡,那麼為了解決NBA球員不想讓別人知道自己真實年齡的問題
            //我們就可以對年齡進行操作-造假 讓年齡更小
        $age = $this->age-2;
        echo $this->name."的age=".$age."<br/>";
    }
 }
 
 //建立喬丹物件
 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23");
 $jordon->getAge();//結果Ok 說明年齡是可以獲取到的,既然可以獲取到age我們在函數內部作假,來達到一個謊報年齡的目的
?>

執行效果如下:

4.png

總結:

1.知道了在PHP中資料存取有三種形式,public,protected,private

2.知道了3種資料存取方式各自的特點

以上就是PHP物件導向之3種資料存取方式詳解(程式碼範例)的詳細內容,更多請關注TW511.COM其它相關文章!