掌握PHP中資料存取的3種方式的定義和作用
1、public
2、protected
3、private
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)的建構函式中直接存取 ?>
執行效果如下:
案例二:知道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/>";//結果報錯,說明不行 ?>
執行效果如下:
案例三:知道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();//結果報錯,說明也不能在子類中存取 ?>
執行效果如下:
總結:
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我們在函數內部作假,來達到一個謊報年齡的目的 ?>
執行效果如下:
總結:
1.知道了在PHP中資料存取有三種形式,public,protected,private
2.知道了3種資料存取方式各自的特點
以上就是PHP物件導向之3種資料存取方式詳解(程式碼範例)的詳細內容,更多請關注TW511.COM其它相關文章!