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

posted @ 2018-07-11 14:01  不觉风止  阅读(718)  评论(0编辑  收藏  举报