zoukankan      html  css  js  c++  java
  • PHP中private、public、protected的区别详解

    先简单粗俗的描述下:
    public 表示全局,类内部外部子类都可以访问;
    private表示私有的,只有本类内部可以使用;
    protected表示受保护的,只有本类或子类或父类中可以访问;

    再啰嗦的解释下:

    一、

    public: 公有类型

    在子类中可以通过 self::属性名(或方法名)  调用public方法或属性,parent::方法名 调用父类方法

    在实例中可以能过 $obj->属性名(或方法名) 来调用 public类型的方法或属性

    protected: 受保护类型

    在子类中可以通过 self::属性名(或方法名) 调用protected方法或属性,parent::属性名(或方法名) 调用父类方法。

    在实例中不能通过 $obj->属性名(或方法名) 来调用  protected类型的方法或属性   

    private: 私有类型
    该类型的属性或方法只能在该类中使用,

    在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法

    二、
    self 和parent 的区别
      a).在子类中常用到这两个对像。他们的主要区别在于self可以调用父类中的公有或受保护的属性,但parent不可以调用

      b).self:: 它表示当前类的静态成员(方法和属性)与 $this不同,$this是指当前对像

    直接上一示例:

    <?php
    //父类
    class father{
        public function a(){
            echo "public function a".PHP_EOL;
        }
        private function b(){
            echo "private function b".PHP_EOL;
        }
        protected function c(){
            echo "protected function c".PHP_EOL;
        }
    }
    //子类
    class child extends father{
        function d(){
            parent::a();//调用父类的a方法
        }
        function e(){
            parent::c(); //调用父类的c方法
        }
        function f(){
            parent::b(); //调用父类的b方法
        }
    }
    $father=new father();
    $father->a(); //输出 public function a
    $father->b(); //显示错误 外部无法调用私有的方法
    $father->c(); //显示错误 外部无法调用受保护的方法
    $chlid=new child();
    $chlid->d();//输出 public function a
    $chlid->e(); ////输出 protected function c
    $chlid->f();//显示错误 无法调用父类private的方法  Uncaught Error: Call to private method father::b() from context 'child'

     通过上面实力我们可以看出:

      protected 保护模式 只在类本身及派生类中可访问,那么 这个$chlid->e(); 调用的是 father 的function c(), 也就说 在child 中调用father的c 是可以的. 但如果你直接用child->c(), 那就是不行的. 要通过child的e() 中转一下 才能调用到father 的c()

    再来举例说明:

    <?php
    class Man {
        private $name = '周伯通';
        protected $money = 3000;
        public $age = 30;
    
        public function say() {
            echo '我叫',$this->name,'<br />';
            echo '我有',$this->money,'元钱<br />';
            echo '我今年',$this->age,'岁';
        }
    }
    
    class Stu extends Man {
        private $friend = '小白';
        public function talk() {
            echo '我叫',$this->name,'<br />';//我叫 Notice: Undefined property: Stu::$name in D:webmytestp.php on line 18
            echo '我有',$this->money,'元钱<br />'; //我有3000元钱
            echo '我今年',$this->age,'岁<br />';//我今年30岁
        }
    }
    $class = new Stu();
    echo $class->age,'<br />'; // 28
    
    echo $class->friend; //出错:因为类外不能调用private
    echo $class->money; //出错:因为类外不能调用protected属性
    $class->talk();

    以上输出:

    30
    <br />
    <br />
    <b>Fatal error</b>:  Uncaught Error: Cannot access private property Stu::$friend in D:webmytestp.php:26
    Stack trace:
    #0 {main}
      thrown in
    <b>D:webmytestp.php</b> on line
    <b>26</b>
    <br />

    分析原因: Undefined property: Stu::$name 这是说明:stu对象 没有name属性 但上面不是说私有的不是可以继承吗? 是可以继承过来,但系统有标记,标记其为父类层面的私有属性. 因此无权调用,导致此错发生. 可以分析出: protected 可以在 子类内访问

    protected能在子类访问,本类内能否访问? 答:当然可以

  • 相关阅读:
    倒计时浏览器跳转JavaScript
    C#.NET中使用存储过程的方法及其优点
    利用GridView控件导出其他文件(导出Excel,导出Word文件)
    c#.net用JavaScript实现 时钟显示
    程序执行一半后可以跳出对话框选择是否继续执行
    FreeMarker 中文官方参考手册 For Freemarker 2.3.23
    Spring技术内幕之Spring Data JPA-自定义Repository实现
    ehcache入门基础示例
    SpringData JPA 接口和方法
    Springboot中使用缓存
  • 原文地址:https://www.cnblogs.com/phpper/p/8976304.html
Copyright © 2011-2022 走看看