php 实现多态
PHP 实现多态的方法
多态是面向对象编程的三大特性之一,允许不同类的对象对同一消息做出响应。PHP 主要通过以下方式实现多态:
通过接口实现多态
定义接口并让不同类实现该接口,通过接口类型调用方法时,实际执行的是具体实现类的方法。
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
echo "Bark";
}
}
class Cat implements Animal {
public function makeSound() {
echo "Meow";
}
}
function animalSound(Animal $animal) {
$animal->makeSound();
}
$dog = new Dog();
$cat = new Cat();
animalSound($dog); // 输出: Bark
animalSound($cat); // 输出: Meow
通过抽象类实现多态
抽象类定义部分实现,子类继承并实现抽象方法,通过父类引用调用子类方法。
abstract class Shape {
abstract public function area();
}
class Circle extends Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return pi() * pow($this->radius, 2);
}
}
class Square extends Shape {
private $side;
public function __construct($side) {
$this->side = $side;
}
public function area() {
return pow($this->side, 2);
}
}
function printArea(Shape $shape) {
echo $shape->area();
}
$circle = new Circle(5);
$square = new Square(4);
printArea($circle); // 输出: 78.539816339745
printArea($square); // 输出: 16
通过方法重写实现多态
子类重写父类方法,通过父类引用调用子类方法时,执行的是子类重写后的方法。
class Vehicle {
public function startEngine() {
echo "Engine started";
}
}
class Car extends Vehicle {
public function startEngine() {
echo "Car engine started with key";
}
}
class Bike extends Vehicle {
public function startEngine() {
echo "Bike engine started with kick";
}
}
function startVehicle(Vehicle $vehicle) {
$vehicle->startEngine();
}
$car = new Car();
$bike = new Bike();
startVehicle($car); // 输出: Car engine started with key
startVehicle($bike); // 输出: Bike engine started with kick
通过 trait 实现多态
trait 可以作为代码复用的机制,在不同类中使用相同的 trait 实现类似多态的效果。
trait Greeting {
public function greet() {
echo "Hello";
}
}
class EnglishGreeter {
use Greeting;
}
class FrenchGreeter {
use Greeting;
public function greet() {
echo "Bonjour";
}
}
$english = new EnglishGreeter();
$french = new FrenchGreeter();
$english->greet(); // 输出: Hello
$french->greet(); // 输出: Bonjour
以上方法展示了 PHP 中实现多态的不同方式,开发者可以根据具体需求选择合适的方法。接口和抽象类更适合定义规范,而方法重写和 trait 更适合代码复用和灵活扩展。







