自 PHP 5 起完全重写了对象模型以得到更佳性能和更多特性。PHP 5 具有完整的对象模型。
PHP中的对象都是引用类型,而不是整个对象的拷贝。对象的传递是引用类型传递。
一、什么是重写
重写override是面向对象编程的重要基础。是类的多态的一种实现。
重写是子类对父类的允许访问的方法的实现过程进行重新编写,即子类覆盖了父类的同名方法。
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要重写父类的方法。
我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了(重写父类方法)。
二、重写的方法名称必须相同
子类中的方法名称必须和父类中被重写方法的名称一致。
三、重写的访问权限规则
子类中方法的访问权限一定不能低于父类被重写方法的访问权限,也就是一定要高于或等于父类方法的访问权限。
父类: public,子类:只能是public
父类: protected,子类:可以是protected或public
父类: private, 子类:不能覆盖。即父类的私有成员,子类不能覆盖。
四、重写的参数要求
重写对方法参数的要求是兼容。即数量和类型不能少于被重写的函数。如果被重写方法指定了类型,那么类型的顺序必须一致。
而且要求参数的个数不能少于被重写方法的参数个数。即传递的参数名字可以为任意,传递的个数必须相同。
五、示例这个例子中我们创建了父类A,和它的子类B,将父类的方法复制到子类中,并测试重写情况。
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