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

  • 相关阅读:
    (转)C# DES
    (转)adb shell am 的用法
    (转)C# 解析 json
    (转)C#执行exe程序
    (转) C# textbox 限制输入问题
    (转)C# SSL-X509使用
    事务管理
    spring数据源
    2.spring 学习
    sonarqube 代码检查
  • 原文地址:https://www.cnblogs.com/chenmenghui/p/9294080.html
Copyright © 2011-2022 走看看