面向对象三大特性:
封装、继承、多态
多态--什么是多态
一个类,被多个子类继承,如果这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态。(同一个类的不同子类表现出不同的形态),除了方法重载,多态另一种表现形式就是方法重写/方法覆盖。
方法重写/方法覆盖(override)介绍:
简单的说:方法重写就是子类有一个方法,和父类的某个方法的名称、参数个数一样,那么我们就说子类的这个方法重写(覆盖)了父类的那个方法
方法覆盖有很多条件,总的讲有三点一定注意:
1、子类的方法的参数个数,方法名称,要和父类方法的参数个数,方法名称一样(并不要求参数名称一样)。
2、子类方法不能缩小父类方法的访问权项.(访问修饰符可以不一样但是必须满足子类的访问范围>=父类的访问范围)
3、在子类中需要访问其父类的方法(public/protected属性),可以使用父类名::方法名()或者parent::方法名()来完成.
例如:
<?PHP
class Animal
{
public $name;
protected $price; //注意当父类函数cry有参数,继承类无参数时会报错!php不支持方法重载
public function cry()
{
echo "不知道动物怎么叫..";
}
}
class Dog extends Animal
{
function cry()
{
echo "小狗汪汪叫..";
Animal::cry(); //访问父类cry()
}
}
class Pig extends Animal
{
function cry1()
{
echo "哼哼叫..";
}
}
//当子类没有覆盖父类的方法则cry方法调用的是父类,当子类覆盖了父类的方法,则调用了自己的cry()
$dog1=new Dog();
$dog1->cry("hello");
$pig1=new Pig();
$pig1->cry();
?>
---------- 编译结果 ----------
小狗汪汪叫..不知道动物怎么叫..不知道动物怎么叫..