zoukankan      html  css  js  c++  java
  • php类的覆盖

    看一个有趣的例子

    <?php
    class employee{
        private  $sal=3000;         // ->1
    //    protected    $sal=3000;   // ->2 
    
        public function getSal(){
            return $this->sal;
        }
    }
    
    class Manager extends employee {
        protected  $sal=5000;
    
        public function getParentSal(){
    //        return $this->getSal();         // ->3
            return parent::getSal();        // ->4
        }
    
        public function getSal() {
            return $this->sal;
        }
    }
    
    header('content-type:text/html;charset:utf8');
    $manager = new Manager();
    echo "PHP ".phpversion()."<br>";
    echo $manager->getSal();
    echo "<br>";
    echo "parent's $sal ".$manager->getParentSal();
    

    1. public和protect

    首先知道两者的区别:protect可以被继承,而private不可以被继承

    ->4 中parent:: 调用的是父类的方法

    当父类的同名属性为private(->1启用而->2注释)时,->4获取到的是父类$sal的值;

    当父类的同名属性为protect(->1注释而->2启用)时,->4获取到的是子类$sal的值;

    也就是说明,父子同名的protect属性,子类会覆盖父类.而父类的private不会被继承,也就不会被覆盖

    2. parent

    首先当父类父类的同名属性为private(->1启用而->2注释),即父类的属性没有被覆盖时,可以看到

    注意->3和->4

    return $this->getSal()引用的是子类的方法

    return parent::getSal()引用的是父类的方法

    举个例子

    <?php
    class a{
        public function test() {
            return 'a';
        }
    }
    
    class b extends a{
        public function test() {
            return 'b';
        }
    }
    
    class c extends b{
        public function test() {
            return parent::test();
        }
    }
    
    $t = new c();
    echo $t->test(); // b
    

    如上的继承关系中,类c中的test()会覆盖b中的test();而类b中的test()会覆盖类c中的test();

    所以,类c的parent::test()会引用类b中的test()方法.

    另外,如果类b中没有同名方法test(),则最后打印的结果会是a

  • 相关阅读:
    java IO选择流的原则及其与IO流相关类的关系
    图形用户界面(graphical user interface)
    泛型
    流、文件及基于文本的应用
    java线程
    多态与方法调用
    在eclipse中使用javap工具反汇编
    java类的访问控制符与其他几个特殊修饰符的总结
    java中几个特殊的类
    @property在内存管理中的参数问题
  • 原文地址:https://www.cnblogs.com/chenmenghui/p/9294080.html
Copyright © 2011-2022 走看看