知优码

您现在的位置是:首页 > Php语言 > php进阶

php进阶

深入理解php面向对象的重写和多态

2020-04-30php进阶
重写override是面向对象编程的重要基础。是类的多态的一种实现。重写是子类对父类的允许访问的方法的实现过程进行重新编写,即子类覆盖了父类的同名方法。

php面向对象重写
自 PHP 5 起完全重写了对象模型以得到更佳性能和更多特性。PHP 5 具有完整的对象模型。
PHP中的对象都是引用类型,而不是整个对象的拷贝。对象的传递是引用类型传递。

一、什么是重写

重写override是面向对象编程的重要基础。是类的多态的一种实现。
重写是子类对父类的允许访问的方法的实现过程进行重新编写,即子类覆盖了父类的同名方法。

重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要重写父类的方法。
我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了(重写父类方法)。

二、重写的方法名称必须相同

子类中的方法名称必须和父类中被重写方法的名称一致。

三、重写的访问权限规则

子类中方法的访问权限一定不能低于父类被重写方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

父类: public,子类:只能是public
父类: protected,子类:可以是protected或public
父类: private, 子类:不能覆盖。即父类的私有成员,子类不能覆盖。

四、重写的参数要求

重写对方法参数的要求是兼容。即数量和类型不能少于被重写的函数。如果被重写方法指定了类型,那么类型的顺序必须一致。
而且要求参数的个数不能少于被重写方法的参数个数。即传递的参数名字可以为任意,传递的个数必须相同。

五、示例

这个例子中我们创建了父类A,和它的子类B,将父类的方法复制到子类中,并测试重写情况。
<?php

class A
{//父类
    public function test(){
        $this->testPublic();
        $this->testProtected();
        $this->testPrivate();
    }

    public function testPublic() {
        echo "A::testPublic\n";
    }

    protected function testProtected() {
        echo "A::testProtected\n";
    }


    private function testPrivate() {
        echo "A::testPrivate\n";
    }
}

class B extends A
{//子类
    public function testPublic() {
        echo "B::testPublic\n";
    }

    protected function testProtected() {
        echo "B::testProtected\n";
    }


    private function testPrivate() {
        echo "B::testPrivate\n";
    }
}

$obj = new B();
$obj->test();

输出如下:

B::testPublic
B::testProtected
A::testPrivate



phpstorm激活码:https://www.javaidea.cn/topic/1331.html