掌握PHP中資料存取的3種方式的定義與作用
1、public
#2、protected
3、private
1、Public
:公有的類別成員
可以在任何地方存取,具體可以被哪些存取了:
● 定義該類別的類別(自身)
#● 該類別的子類別
● 其他類別
#2、Protected
:受保護的類別成員
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)的构造函数中直接访问 ?>
<?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/>";//结果报错,说明不行
?>
<?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種資料存取方式詳解(程式碼實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!