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";
}
}
$animals = [new Dog(), new Cat()];
foreach ($animals as $animal) {
$animal->makeSound();
}
通过接口实现
定义接口并让不同类实现同一接口,强制实现特定方法。
interface Shape {
public function calculateArea();
}
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function calculateArea() {
return pi() * $this->radius * $this->radius;
}
}
class Square implements Shape {
private $side;
public function __construct($side) {
$this->side = $side;
}
public function calculateArea() {
return $this->side * $this->side;
}
}
$shapes = [new Circle(5), new Square(4)];
foreach ($shapes as $shape) {
echo $shape->calculateArea();
}
通过抽象类实现
抽象类定义部分实现,子类完成具体实现。
abstract class Vehicle {
abstract public function startEngine();
}
class Car extends Vehicle {
public function startEngine() {
echo "Car engine started";
}
}
class Motorcycle extends Vehicle {
public function startEngine() {
echo "Motorcycle engine started";
}
}
$vehicles = [new Car(), new Motorcycle()];
foreach ($vehicles as $vehicle) {
$vehicle->startEngine();
}
通过类型提示实现
在方法参数中使用类型提示,接受实现了特定接口或继承特定类的对象。
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
file_put_contents('log.txt', $message, FILE_APPEND);
}
}
class DatabaseLogger implements Logger {
public function log($message) {
// 数据库日志记录逻辑
}
}
function logMessage(Logger $logger, $message) {
$logger->log($message);
}
logMessage(new FileLogger(), "File log message");
logMessage(new DatabaseLogger(), "Database log message");
通过魔术方法实现
使用 __call 或 __callStatic 实现动态方法调用。
class DynamicPolymorphism {
public function __call($name, $arguments) {
if ($name === 'process') {
if (count($arguments) === 1) {
return $this->processSingle($arguments[0]);
} elseif (count($arguments) === 2) {
return $this->processDouble($arguments[0], $arguments[1]);
}
}
}
private function processSingle($arg) {
echo "Processing single: $arg";
}
private function processDouble($arg1, $arg2) {
echo "Processing double: $arg1, $arg2";
}
}
$processor = new DynamicPolymorphism();
$processor->process("one");
$processor->process("one", "two");
通过特征(Trait)实现
Trait 可以作为代码复用机制,在不同类中实现相似功能。
trait Loggable {
public function log($message) {
echo "Logging: $message";
}
}
class User {
use Loggable;
}
class Product {
use Loggable;
}
$user = new User();
$product = new Product();
$user->log("User created");
$product->log("Product created");
以上方法展示了 PHP 中实现多态的不同方式,开发者可以根据具体需求选择最适合的实现方案。






