php 实现多态
PHP 实现多态的方法
多态是面向对象编程的三大特性之一,PHP 通过继承和接口实现多态。以下是几种常见的实现方式:
通过继承实现多态
子类继承父类并重写父类方法,运行时根据对象类型调用相应方法。

class Animal {
public function makeSound() {
echo "Animal sound";
}
}
class Dog extends Animal {
public function makeSound() {
echo "Bark";
}
}
class Cat extends Animal {
public function makeSound() {
echo "Meow";
}
}
function animalSound(Animal $animal) {
$animal->makeSound();
}
$dog = new Dog();
$cat = new Cat();
animalSound($dog); // 输出: Bark
animalSound($cat); // 输出: Meow
通过接口实现多态
定义接口并让不同类实现相同接口,实现多态行为。
interface Shape {
public function draw();
}
class Circle implements Shape {
public function draw() {
echo "Drawing circle";
}
}
class Square implements Shape {
public function draw() {
echo "Drawing square";
}
}
function renderShape(Shape $shape) {
$shape->draw();
}
$circle = new Circle();
$square = new Square();
renderShape($circle); // 输出: Drawing circle
renderShape($square); // 输出: Drawing square
抽象类实现多态
抽象类定义抽象方法,子类必须实现这些方法。

abstract class Vehicle {
abstract public function drive();
}
class Car extends Vehicle {
public function drive() {
echo "Driving car";
}
}
class Bike extends Vehicle {
public function drive() {
echo "Riding bike";
}
}
function operateVehicle(Vehicle $vehicle) {
$vehicle->drive();
}
$car = new Car();
$bike = new Bike();
operateVehicle($car); // 输出: Driving car
operateVehicle($bike); // 输出: Riding bike
方法重载(魔术方法)
PHP 不支持传统方法重载,但可通过 __call 魔术方法模拟。
class Overload {
public function __call($name, $arguments) {
if ($name === 'test') {
if (count($arguments) === 1) {
echo "Called with 1 argument";
} elseif (count($arguments) === 2) {
echo "Called with 2 arguments";
}
}
}
}
$obj = new Overload();
$obj->test(1); // 输出: Called with 1 argument
$obj->test(1, 2); // 输出: Called with 2 arguments
类型提示与多态
PHP 的类型提示功能可确保参数实现特定接口或继承特定类。
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
echo "Log to file: $message";
}
}
class DatabaseLogger implements Logger {
public function log($message) {
echo "Log to database: $message";
}
}
function logMessage(Logger $logger, $message) {
$logger->log($message);
}
$fileLogger = new FileLogger();
$dbLogger = new DatabaseLogger();
logMessage($fileLogger, "Test message"); // 输出: Log to file: Test message
logMessage($dbLogger, "Test message"); // 输出: Log to database: Test message
以上方法展示了 PHP 中实现多态的不同方式,开发者可根据具体需求选择合适的方法。






