PHP中,继承与多态是面向对象编程的重要特性。继承允许对象获取其他对象的属性和方法,多态允许子类重写父类的方法。本文将深入剖析继承与多态机制,帮助您轻松掌握面向对象编程的核心思想。
1. 继承机制
继承机制允许一个类继承另一个类(父类)的属性和方法。子类可以重写父类的方法,从而拥有不同的行为。继承关系使用关键字extends
来定义。例如:
class Animal {
protected $name;
public function getName() {
return $this->name;
}
}
class Dog extends Animal {
public function bark() {
echo "Woof!";
}
}
$dog = new Dog();
echo $dog->getName(); // Output: null
$dog->bark(); // Output: Woof!
在上面的示例中,Dog
类继承了Animal
类的属性和方法。Dog
类重写了getName
方法,并添加了自己的方法bark
。因此,Dog
对象可以调用getName
方法和bark
方法,而Animal
对象只能调用getName
方法。
1.1 访问权限
子类可以访问父类的公有和受保护的属性和方法。子类不能访问父类的私有属性和方法。例如:
class Animal {
private $age;
public function getAge() {
return $this->age;
}
}
class Dog extends Animal {
public function getPrivateAge() {
return $this->age; // Error: Cannot access private property
}
}
在上面的示例中,Dog
类无法访问父类Animal
类的私有属性age
。
1.2 构造方法和析构方法
当子类对象被创建时,它的构造方法会自动调用父类的构造方法。当子类对象被销毁时,它的析构方法会自动调用父类的析构方法。例如:
class Animal {
public function __construct($name) {
$this->name = $name;
echo "Animal constructor called
";
}
public function __destruct() {
echo "Animal destructor called
";
}
}
class Dog extends Animal {
public function __construct($name, $breed) {
parent::__construct($name); // Call the parent constructor
$this->breed = $breed;
echo "Dog constructor called
";
}
public function __destruct() {
parent::__destruct(); // Call the parent destructor
echo "Dog destructor called
";
}
}
$dog = new Dog("Fido", "Golden Retriever");
// Output:
// Animal constructor called
// Dog constructor called
unset($dog);
// Output:
// Dog destructor called
// Animal destructor called
在上面的示例中,当Dog
对象被创建时,它的构造方法会自动调用父类Animal
类的构造方法。当Dog
对象被销毁时,它的析构方法会自动调用父类Animal
类的析构方法。
2. 多态机制
多态机制允许子类重写父类的方法,从而拥有不同的行为。多态特性是通过方法重写(method overriding)来实现的。例如:
class Animal {
public function speak() {
echo "I am an animal.
";
}
}
class Dog extends Animal {
@Override
public function speak() {
echo "Woof!
";
}
}
class Cat extends Animal {
@Override
public function speak() {
echo "Meow!
";
}
}
$animals = [new Dog(), new Cat()];
foreach ($animals as $animal) {
$animal->speak();
}
// Output:
// Woof!
// Meow!
在上面的示例中,Dog
类和Cat
类都继承了Animal
类的speak
方法。但是,Dog
类和Cat
类分别重写了speak
方法,从而拥有了自己的行为。因此,当调用speak
方法时,不同的子类对象会发出不同的声音。
多态机制允许您编写通用代码,而无需考虑具体的子类。例如,您可以编写一个speak()
方法,该方法可以被任何动物类对象调用,而无需知道该动物的具体类型。
总结
继承与多态是面向对象编程的核心特性。继承允许对象获取其他对象的属性和方法,多态允许子类重写父类的方法。掌握继承与多态机制可以帮助您编写出更加灵活和可维护的代码。