本文目標(biāo)
掌握PHP中數(shù)據(jù)訪問(wèn)的3種方式的定義和作用
1、public
2、protected
3、private
(一)、數(shù)據(jù)訪問(wèn)的3種方式
1、Public
:公有的類成員
可以在任何地方訪問(wèn),具體可以被哪些訪問(wèn)了:
● 定義該類的類(自身)
● 該類的子類
● 其他類
2、Protected
:受保護(hù)的類成員
● 定義該類的類(自身)
● 該類的子類
3、Private
:私有的類成員
● 只有自身才可以訪問(wèn)
總結(jié):從上到下約束能力是越來(lái)越強(qiáng)的
單純從以上的文字描述,我們理解起來(lái)還是有點(diǎn)費(fèi)力的,那么還是按照理論+實(shí)踐的方式來(lái)進(jìn)行理解,那么接下來(lái)我們就通過(guò)具體的代碼來(lái)理解這3種數(shù)據(jù)訪問(wèn)的方式在PHP中到底是如何實(shí)現(xiàn)的,到底它們各自的特點(diǎn)是什么,最后來(lái)體會(huì)一下它們的約束能力到底又是怎樣。
(二)具體代碼
說(shuō)明:為了讓大家能更好的理解面向?qū)ο?,所以寫文章的時(shí)候,我也是盡量遵循一定的規(guī)則,由淺到深,由易到難,所以我寫的每篇文章都是和上篇文章有一定的關(guān)聯(lián),比如以下的代碼案例,我又是在上篇文章的代碼上進(jìn)行的拓展和延伸。
案例一:知道public的定義,然后證明它可以在3個(gè)地方都可以訪問(wèn)(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 "我是女主播,我會(huì)唱歌<br/>"; } } // Nba球員類 class NbaPlayer extends Human{ //因?yàn)楦割愐呀?jīng)有了,所以就不需要再寫了,通過(guò)extends來(lái)實(shí)現(xiàn) // public $name = "";//姓名 // public $height = "";//身高 // public $weight = "";//體重 public $team = "";//團(tuán)隊(duì) public $playerName = "";//球員號(hào)碼 public function __construct( $name,$height,$weight,$team,$playerName ){ $this->name = $name; $this->height=$height; $this->weight = $weight; $this->team = $team; $this->playName = $playerName; echo "構(gòu)造函數(shù)執(zhí)行了,當(dāng)前對(duì)象是{$this->name}<br/>"; } //跑步 public function run(){ echo "跑步中<br/>"; } //跳躍 public function jump(){ echo "跳躍<br/>"; } //運(yùn)球 public function dribble(){ echo "運(yùn)球<br/>"; } //傳球 public function pass(){ echo "傳球<br/>"; } //投籃 public function shoot(){ echo "投籃<br/>"; } //扣籃 public function dunk(){ echo "扣籃<br/>"; } } //數(shù)據(jù)訪問(wèn)測(cè)試 //public 測(cè)試 //1、測(cè)試在類的外部可以訪問(wèn) //創(chuàng)建喬丹對(duì)象 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23"); //輸出喬丹對(duì)象 echo "名稱= ".$jordon->name."<br/>";//結(jié)果能夠輸出來(lái),說(shuō)明在外部是可以訪問(wèn)Public類成員的 //2、測(cè)試在類的自身里面可以訪問(wèn) //例子:比如構(gòu)造函數(shù)里,我們可以直接通過(guò)$this->team //3、測(cè)試是否可以子類中可以訪問(wèn) //例子:比如父類中定義的name 一樣可以在子類(NbaPlayer)的構(gòu)造函數(shù)中直接訪問(wèn) ?>
運(yùn)行效果如下:
案例二:知道protected的定義,然后證明它可以在2個(gè)地方都可以訪問(wèn)(1.在自己定義的類中,2.在子類中 )
<?php //定義“人”類 class Human{ public $name = "";//姓名 public $height = "";//身高 public $weight = "";//體重 protected $addr = "長(zhǎng)沙";//受保護(hù)的類 public function eat($food){ echo $this->name."在吃".$food."<br/>"; } //測(cè)試protected類成員是否可以在自身類中可以訪問(wèn) 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 "我是女主播,我會(huì)唱歌<br/>"; } //重寫方法eat public function eat($food){ echo "我是女主播,我是邊唱歌邊吃{$food}<br/>"; } } class NbaPlayer extends Human{ //因?yàn)楦割愐呀?jīng)有了,所以就不需要再寫了,通過(guò)extends來(lái)實(shí)現(xiàn) // public $name = "";//姓名 // public $height = "";//身高 // public $weight = "";//體重 public $team = "";//團(tuán)隊(duì) public $playerName = "";//球員號(hào)碼 public function __construct( $name,$height,$weight,$team,$playerName ){ $this->name = $name; $this->height=$height; $this->weight = $weight; $this->team = $team; $this->playName = $playerName; echo "構(gòu)造函數(shù)執(zhí)行了,當(dāng)前對(duì)象是{$this->name}<br/>"; } //測(cè)試protected類成員是否可以在子類中可以訪問(wèn) public function getAddrInNbaPlayer(){ echo "在NbaPlayer子類中addr=".$this->addr."<br/>"; } } //創(chuàng)建喬丹對(duì)象 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23"); //數(shù)據(jù)訪問(wèn)測(cè)試 //protected測(cè)試 //1、測(cè)試是否可以在自身類中可以訪問(wèn) $jordon->getAddrInHuman();//結(jié)果OK,確實(shí)是可以訪問(wèn) //2.測(cè)試是否可以在子類中訪問(wèn) $jordon->getAddrInNbaPlayer();//結(jié)果OK,確實(shí)也是可以訪問(wèn) //3.測(cè)試是否可以被外部訪問(wèn) echo "在類外部訪問(wèn)addr=".$jordon->addr."<br/>";//結(jié)果報(bào)錯(cuò),說(shuō)明不行 ?>
運(yùn)行效果如下:
案例三:知道private的定義,然后證明它只能在1個(gè)地方可以訪問(wèn)(1.在自己定義的類中)
<?php //定義“人”類 class Human{ public $name = "";//姓名 public $height = "";//身高 public $weight = "";//體重 private $isHungry = true;//測(cè)試私有變量是否可以在子類中訪問(wèn) //為了讓外部可以訪問(wèn)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 "我是女主播,我會(huì)唱歌<br/>"; } //重寫方法eat public function eat($food){ echo "我是女主播,我是邊唱歌邊吃{$food}<br/>"; } } class NbaPlayer extends Human{ //因?yàn)楦割愐呀?jīng)有了,所以就不需要再寫了,通過(guò)extends來(lái)實(shí)現(xiàn) // public $name = "";//姓名 // public $height = "";//身高 // public $weight = "";//體重 public $team = "";//團(tuán)隊(duì) public $playerName = "";//球員號(hào)碼 public function __construct( $name,$height,$weight,$team,$playerName ){ $this->name = $name; $this->height=$height; $this->weight = $weight; $this->team = $team; $this->playName = $playerName; // echo "構(gòu)造函數(shù)執(zhí)行了,當(dāng)前對(duì)象是{$this->name}<br/>"; } //測(cè)試private類成員是否可以在子類中訪問(wèn) public function getIsHungryInNbaPlayer(){ echo "在NbaPlayer子類中isHungry=".$this->isHungry."<br/>"; } } //創(chuàng)建喬丹對(duì)象 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23"); //數(shù)據(jù)訪問(wèn)測(cè)試 //private測(cè)試 //1.測(cè)試私有變量能否被外部訪問(wèn) echo "私有變量isHungry =".$jordon->isHungry ."<br/>";//結(jié)果不能訪問(wèn),說(shuō)明private變量不能被子類訪問(wèn) //測(cè)試私有變量能否在定義的類的內(nèi)部訪問(wèn) echo $jordon->getPrivateInfo();//結(jié)果Ok,說(shuō)明可以 //測(cè)試私有變量是否可以在子類中訪問(wèn) $jordon->getIsHungryInNbaPlayer();//結(jié)果報(bào)錯(cuò),說(shuō)明也不能在子類中訪問(wèn) ?>
運(yùn)行效果如下:
總結(jié):
1、Public:公有的類成員
可以在任何地方訪問(wèn),具體可以被哪些訪問(wèn)了:
● 定義該類的類(自身)
● 該類的子類
● 其他類
2、Protected:受保護(hù)的類成員
● 可以被其自身及其子類訪問(wèn)
3、Private:私有的類成員
● 只有自身才可以訪問(wèn)
4.為了讓外部可以訪問(wèn)private類成員,我們可以通過(guò)在類中定義一個(gè)public方法,然后在public方法中返回private類成員
好,到了這里,想必大家對(duì)數(shù)據(jù)訪問(wèn)應(yīng)該有了一個(gè)比較清晰的認(rèn)識(shí),那我們現(xiàn)在來(lái)學(xué)以致用,用我們學(xué)到的這個(gè)知識(shí)來(lái)解決以下的問(wèn)題,先自己思考一下怎么做,然后再看答案
問(wèn)題:NBA球員一般都不想讓其他人知道自己的真實(shí)姓名,比如說(shuō)我明明是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 "我是女主播,我會(huì)唱歌<br/>"; } //重寫方法eat public function eat($food){ echo "我是女主播,我是邊唱歌邊吃{$food}<br/>"; } } class NbaPlayer extends Human{ //因?yàn)楦割愐呀?jīng)有了,所以就不需要再寫了,通過(guò)extends來(lái)實(shí)現(xiàn) // public $name = "";//姓名 // public $height = "";//身高 // public $weight = "";//體重 public $team = "";//團(tuán)隊(duì) public $playerName = "";//球員號(hào)碼 //數(shù)據(jù)訪問(wèn) 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 "構(gòu)造函數(shù)執(zhí)行了,當(dāng)前對(duì)象是{$this->name}<br/>"; } //跑步 public function run(){ echo "跑步中<br/>"; } //跳躍 public function jump(){ echo "跳躍<br/>"; } //運(yùn)球 public function dribble(){ echo "運(yùn)球<br/>"; } //傳球 public function pass(){ echo "傳球<br/>"; } //投籃 public function shoot(){ echo "投籃<br/>"; } //扣籃 public function dunk(){ echo "扣籃<br/>"; } //數(shù)據(jù)訪問(wèn) public function getAge(){ // echo $this->name."的age=".$this->age."<br/>"; //既然能夠在自身類中獲取到年齡,那么為了解決NBA球員不想讓別人知道自己真實(shí)年齡的問(wèn)題 //我們就可以對(duì)年齡進(jìn)行操作-造假 讓年齡更小 $age = $this->age-2; echo $this->name."的age=".$age."<br/>"; } } //創(chuàng)建喬丹對(duì)象 $jordon = new NbaPlayer("喬丹","1.98米","98公斤","公牛","23"); $jordon->getAge();//結(jié)果Ok 說(shuō)明年齡是可以獲取到的,既然可以獲取到age我們?cè)诤瘮?shù)內(nèi)部作假,來(lái)達(dá)到一個(gè)謊報(bào)年齡的目的 ?>
運(yùn)行效果如下:
總結(jié):
1.知道了在PHP中數(shù)據(jù)訪問(wèn)有三種形式,public,protected,private
2.知道了3種數(shù)據(jù)訪問(wèn)方式各自的特點(diǎn)