• public、protected、private的区别


    通过className::functionNmae()、实例化、parent、self得出结论

    className::functionNmae()  需是静态方法(public模式)

    parent::functionNmae() 该类是静态方法调用则父类需是静态方法,该类普通方法调用不限制 。父类方法需是(public、protected两种模式)

    self::functionNmae() 该类需是静态方法(三种模式)

    实例化:实例化后可访问public模式的静态方法或普通方法

    一、直接访问(通过 className::functionNmae()和实例化):

    结论:

                | 可以 通过 className::functionNmae() 访问
    public    
                | 可以 通过实例 $obj->functionName() 访问        

                | 不可 通过 className::functionNmae() 访问
    protected 
                | 不可 通过实例 $obj->functionName() 访问    

                | 不可 通过 className::functionNmae() 访问
    private   
                | 不可 通过实例 $obj->functionName() 访问

    <?php
    /**
     * 
     * @authors HG (hg0728@qq.com)
     * @date    2015-05-26 17:12:02
     * @version 1.0
     */
    header("Content-type:text/html;charset=utf-8");
    class A {
        static $name='这是类A的静态变量';
    
        static public function stc_pc(){
            echo '这是类A的公共静态方法<br />';
        }
        static function stc(){
            echo '这是类A的静态方法<br />';
        }
        static protected function stc_pd(){
            echo '这是类A受保护的静态方法<br />';
        }
        static private function stc_pe(){
            echo '这是类A私有的静态方法<br />';
        }
    }
    
    
    A::stc_pc();//可访问
    
    A::stc();//可访问
    
    A::$name;//不报错
    
    //A::stc_pd();//不可访问
    
    //A::stc_pe();//不可访问
    
    
    echo '<br><br>通过实例化访问<br><br>';
    
    
    $a = new A();
    
    $a->stc_pc();//可访问
    
    $a->stc();//可访问
    
    //$a->$name;//报错
    
    //$a->stc_pd();//不可访问
    
    //$a->stc_pe();//不可访问
    
    
    
    
    
    /********************
              | 可以 通过 className::functionNmae() 访问
    public    | 
              | 可以 通过实例 $obj->functionName() 访问        
    
              | 不可 通过 className::functionNmae() 访问
    protected | 
              | 不可 通过实例 $obj->functionName() 访问    
    
              | 不可 通过 className::functionNmae() 访问
    private   | 
              | 不可 通过实例 $obj->functionName() 访问    
    ********************/

    二、直接访问(self::functionNmae())

    结论:

    self::functionNmae();需是静态方法(三种模式都可)

    <?php
    /**
     * 
     * @authors HG (hg0728@qq.com)
     * @date    2015-05-26 17:18:50
     * @version 1.0
     */
    header("Content-type:text/html;charset=utf-8");
    
    class C {
        static $name = "静态变量";  
        static public function stc_pc(){        
            echo '静态公共方法<br>';
            self::stc_pd();
            self::stc_pe();
            self::stc();
            //self::func();//报错但有结果
            
        }
    
        static protected function stc_pd(){
            echo '静态受保护方法<br>';
        }
        static private function stc_pe(){        
            echo '静态受保护方法<br>';
        }
    
        static function stc(){        
            echo '静态普通方法<br>';
        }
        function func(){        
            echo '普通方法<br>';
        }
        
    }
    
    
    C::stc_pc();
    
    
    /******
    
    self::functionNmae();需是静态方法(三种模式都可)
    
    ******/

    三、通过子类访问父类(parent::functionNmae()和实例化)

    结论:

    parent::functionNmae(); private不可访问
    $obj->functionNmae(); private不可访问

    <?php
    /**
     * 
     * @authors HG (hg0728@qq.com)
     * @date    2015-05-26 17:18:50
     * @version 1.0
     */
    header("Content-type:text/html;charset=utf-8");
    include '/class_a.php';
    
    class B extends A{
        
        static public function index(){        
            parent::stc_pc();
            parent::stc();
            parent::stc_pd();
            parent::$name;//不报错
            //parent::stc_pe();//不可访问
    
            echo '<br><br>通过实例化访问<br><br>';
    
            $a = new A();
            $a->stc_pc();
            $a->stc();
            $a->stc_pd();
            $a->$name;//报错
            //$a->stc_pe();//不可
        }
        
    }
    
    
    B::index();
    
    /******
    
    在子类中通过:
    parent::functionNmae(); private不可访问
    $obj->functionNmae(); private不可访问
    
    ******/

     四、

    <?php
    /**
     * 
     * @authors HG (hg0728@qq.com)
     * @date    2015-05-28 11:54:03
     * @version 1.0
     */
    class functioninc{
        function fc_a(){
            echo '000  ';
        }
    
        static protected function fc_b(){
            echo '111   ';  
        }
        
    }
    class fun extends functioninc {
        static function a(){
            parent::fc_a(); //报错 fc_a()不是静态方法
            parent::fc_b();
        }
        function b(){
            parent::fc_a();
            parent::fc_b();
        }
    }
    /*
    在子类中
    静态方法通过parent调用父类方法,父类方法需是静态方法。
    普通方法通过parent调用父类方法,不限制。
    */
    $a = new fun();
    $a->a();
    $a->b();

    public: 公有类型 在子类中可以通过self::var调用public方法或属性,parent::method调用父类方法     在实例中可以能过$obj->var 来调用 public类型的方法或属性

    protected: 受保护类型 在子类中可以通过self::var调用protected方法或属性,parent::method调用父类方法 在实例中不能通过$obj->var 来调用 protected类型的方法或属性

    private: 私有类型 该类型的属性或方法只能在该类中使用,在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法

  • 相关阅读:
    python yaml文件数据按原有的数据顺序dump
    HTMLTestRunner
    os.path获取当前路径及父路径
    update 字符串拼接
    VSCode 快速生成.vue基本模板、发送http请求模板
    Vue取消eslint语法限制
    node-sass安装失败解决方法
    docker 创建mysql和redis
    阿里云镜像加速器地址
    .net core + xunit 集成测试
  • 原文地址:https://www.cnblogs.com/ahhg/p/4532977.html
Copyright © 2020-2023  润新知