在PHP中,多态(Polymorphism)是面向对象编程(OOP)的三大基本特性之一(另外两个是封装和继承)。多态意味着不同的对象对同一消息做出不同的响应。在PHP中,多态通常通过继承和接口来实现。
以下是如何在PHP中实现多态的基本步骤:
定义接口或抽象类:首先,你需要定义一个接口或抽象类,其中声明了一些方法,这些方法将由具体的子类来实现。
使用接口:
php
interface Shape {
public function draw();
}
或使用抽象类(注意,抽象类可以包含一些默认的实现):
php
abstract class Shape {
public function draw() {
// 默认实现,或者留空作为抽象方法
echo "http://www.creatrust.com.cn";
}
// 也可以添加抽象方法
abstract public function getArea();
}
创建实现接口或继承抽象类的子类:然后,你需要创建一些子类,这些子类实现了接口或继承了抽象类,并提供了具体的方法实现。
php
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function draw() {
echo "Drawing a circle with radius {$this->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 draw() {
echo "Drawing a rectangle with width {$this->width} and height {$this->height}.";
}
public function getArea() {
return $this->width * $this->height;
}
}
注意:在上面的示例中,Circle和Rectangle类都实现了Shape接口,并提供了draw()和getArea()方法的具体实现。虽然getArea()在接口中并没有声明(因为我们使用了抽象类作为示例),但这里为了展示多态性,我们也在接口的实现中包含了它。
使用多态:最后,你可以创建这些类的实例,并将它们存储在一个数组或集合中。然后,你可以遍历这个集合并调用它们的方法,而无需关心它们的具体类型。这就是多态的精髓所在。
php
function drawShapes(array $shapes) {
foreach ($shapes as $shape) {
// 调用 draw 方法,这里不需要知道具体是 Circle 还是 Rectangle
$shape->draw();
echo PHP_EOL;
}
}
$shapes = [new Circle(5), new Rectangle(4, 6)];
drawShapes($shapes);
运行上述代码将输出每个形状的具体绘制信息,而不需要在drawShapes()函数中明确检查每个形状的类型。这就是多态的一个示例,它允许我们在不知道对象具体类型的情况下调用它们的方法。