子类重写父类的 protected 方法有什么限制

时间:2020-05-11

父类

class ParentCls
{
    private function test1(){
        echo 'ParentCls test1';
    }

    protected function test2(){
        echo 'ParentCls test2';
    }

    public function test3(){
        echo 'ParentCls test3';
    }
}

子类测试

class SonCls extends ParentCls
{
    private function test1(){
        echo 'SonCls test1';
    }

    public function test4(){
        echo 'SonCls test4';
        $this->test1();
    }
}

$son = new SonCls();
$son->test4();

父类的私有方法调用不了,但是可以在子类重写父类的方法!当然子类也无法直接调用私有方法。

修改子类

class SonCls extends ParentCls
{
    public function test1(){
        echo 'SonCls test1';
    }

    public function test4(){
        echo 'SonCls test4';
        $this->test1();
    }
}

$son = new SonCls();
$son->test1();

子类重写父类的私有方法,并且将访问属性设为public后,可以直接调用。

修改父类方法

class ParentCls
{
    final private function test1(){
        echo 'ParentCls test1';
    }

    protected function test2(){
        echo 'ParentCls test2';
    }

    public function test3(){
        echo 'ParentCls test3';
    }
}

被final修饰的类,子类不可以继承,也不可以重写!

修改子类

class SonCls extends ParentCls
{
    public function test2()
    {
        parent::test2();
    }
}

$son = new SonCls();
$son->test2();

父类protected修饰的类,子类可以重写,但子类修饰符只能为public、protected,不能为private。

对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。