PHP面向对象之3种数据访问方式详解代码实例

本文目标

掌握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种数据访问方式各自的特点

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...