PHP基础OOP(二)多态
在PHP中,多态是面向对象编程(OOP)的一个重要概念。多态允许不同的对象对同一消息做出不同的响应。在PHP中,多态可以通过继承和接口实现。
继承实现多态
在PHP中,可以通过继承来实现多态。子类可以重写父类的方法,从而实现不同的行为。以下是一个示例:
class Animal {
public function makeSound() {
echo "Animal makes a sound";
}
}
class Cat extends Animal {
public function makeSound() {
echo "Meow";
}
}
class Dog extends Animal {
public function makeSound() {
echo "Woof";
}
}
$animal = new Animal();
$cat = new Cat();
$dog = new Dog();
$animal->makeSound(); // 输出 "Animal makes a sound"
$cat->makeSound(); // 输出 "Meow"
$dog->makeSound(); // 输出 "Woof"
在上述示例中,Animal类是一个基类,Cat和Dog类是Animal类的子类。Cat和Dog类重写了makeSound()方法,从而实现了不同的行为。
接口实现多态
在PHP中,可以通过接口来实现多态。不同的类可以实现同一个接口,并对接口中的方法做出不同的实现。以下是一个示例:
interface Shape {
public function getArea();
}
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function getArea() {
return pi() * pow($this->radius, 2);
}
}
class Rectangle implements Shape {
private $width;
private $height;
public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
}
public function getArea() {
return $this->width * $this->height;
}
}
$circle = new Circle(5);
$rectangle = new Rectangle(10, 5);
echo $circle->getArea(); // 输出 "78.539816339745"
echo $rectangle->getArea(); // 输出 "50"
在上述示例中,Shape是一个接口,Circle和Rectangle类都实现了Shape接口,并对getArea()方法做出了不同的实现。通过这种方式,我们可以实现多态。
示例1:多态的参数类型
在PHP中,可以使用多态来实现灵活的参数类型。以下是一个示例:
class Animal {
public function makeSound() {
echo "Animal makes a sound";
}
}
class Cat extends Animal {
public function makeSound() {
echo "Meow";
}
}
class Dog extends Animal {
public function makeSound() {
echo "Woof";
}
}
function makeAnimalSound(Animal $animal) {
$animal->makeSound();
}
$animal = new Animal();
$cat = new Cat();
$dog = new Dog();
makeAnimalSound($animal); // 输出 "Animal makes a sound"
makeAnimalSound($cat); // 输出 "Meow"
makeAnimalSound($dog); // 输出 "Woof"
在上述示例中,makeAnimalSound()函数接受一个Animal类型的参数。由于Cat和Dog类都是Animal类的子类,因此它们也可以作为参数传递给makeAnimalSound()函数。
示例2:多态的返回类型
在PHP中,可以使用多态来实现灵活的返回类型。以下是一个示例:
interface Shape {
public function getArea();
}
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function getArea() {
return pi() * pow($this->radius, 2);
}
}
class Rectangle implements Shape {
private $width;
private $height;
public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
}
public function getArea() {
return $this->width * $this->height;
}
}
function getShapeArea(Shape $shape) {
return $shape->getArea();
}
$circle = new Circle(5);
$rectangle = new Rectangle(10, 5);
echo getShapeArea($circle); // 输出 "78.539816339745"
echo getShapeArea($rectangle); // 输出 "50"
在上述示例中,getShapeArea()函数接受一个Shape的参数,并返回一个浮点数。由于Circle和Rectangle类都实现了Shape接口,并对getArea()方法做出了不同的实现,因此它们也可以作为参数传递给getShapeArea()函数。
通过以上示例,您可以了解如何在PHP中使用多态。请注意,在使用多态时,应仔细检查数据类型,并遵循最佳实践。