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 calculateArea();
}
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function calculateArea() {
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 calculateArea() {
return $this->width * $this->height;
}
}
function printArea(Shape $shape) {
echo $shape->calculateArea();
}
$circle = new Circle(5);
$rectangle = new Rectangle(4, 6);
printArea($circle); // 输出圆的面积
printArea($rectangle); // 输出矩形面积
类型提示与多态
PHP的类型提示(类型声明)可以确保参数是特定类或接口的实例,这是实现多态的关键:
function processPayment(PaymentGateway $gateway, $amount) {
$gateway->process($amount);
}
抽象类实现多态
抽象类介于普通类和接口之间,可以包含具体方法和抽象方法:
abstract class PaymentMethod {
abstract public function process($amount);
public function getCurrency() {
return 'USD';
}
}
class CreditCardPayment extends PaymentMethod {
public function process($amount) {
echo "Processing credit card payment of $amount USD";
}
}
class PayPalPayment extends PaymentMethod {
public function process($amount) {
echo "Processing PayPal payment of $amount USD";
}
}
动态方法调用
PHP的__call()魔术方法可以实现动态多态行为:
class DynamicHandler {
public function __call($name, $arguments) {
if ($name === 'process') {
echo "Processing with arguments: " . implode(', ', $arguments);
}
}
}
多态在PHP中主要通过继承体系、接口实现和类型提示来实现,使代码更灵活且易于扩展。





