• 技术文章 >后端开发 >php教程

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

    易达易达2020-05-24 17:33:26原创877

    本文目标

    掌握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种数据访问方式详解(代码实例)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:面向对象
    上一篇:PHP中面向对象之继承 下一篇:正式开源的优雅测试框架 PestPHP
    线上培训班

    相关文章推荐

    • PHP中的面向对象实践-基本实践案例• PHP中的面向对象之构造函数详解• php面向对象之析构函数和对象引用• PHP中面向对象之继承

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网