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 calculateArea();
}
class Circle extends Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function calculateArea() {
return pi() * pow($this->radius, 2);
}
}
class Rectangle extends 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); // 输出: 78.539816339745
printArea($rectangle); // 输出: 24
通过方法重载实现多态
PHP 不支持传统的方法重载,但可以通过魔术方法 __call() 模拟:
class Overload {
public function __call($name, $arguments) {
if ($name == 'calculate') {
if (count($arguments) == 1) {
return $this->calculateSquare($arguments[0]);
} elseif (count($arguments) == 2) {
return $this->calculateRectangle($arguments[0], $arguments[1]);
}
}
}
private function calculateSquare($side) {
return $side * $side;
}
private function calculateRectangle($length, $width) {
return $length * $width;
}
}
$overload = new Overload();
echo $overload->calculate(5); // 25
echo $overload->calculate(4, 6); // 24
通过 Trait 实现多态
Trait 可以作为代码复用的机制,结合多态使用:
trait Loggable {
public function log($message) {
echo "Logging: $message";
}
}
class FileLogger {
use Loggable;
public function log($message) {
echo "File Log: $message";
}
}
class DatabaseLogger {
use Loggable;
public function log($message) {
echo "DB Log: $message";
}
}
function logMessage($logger, $message) {
$logger->log($message);
}
$fileLogger = new FileLogger();
$dbLogger = new DatabaseLogger();
logMessage($fileLogger, "Test message"); // 输出: File Log: Test message
logMessage($dbLogger, "Test message"); // 输出: DB Log: Test message
类型提示与多态
PHP 的类型提示可以确保多态的正确实现:
interface PaymentMethod {
public function processPayment($amount);
}
class CreditCardPayment implements PaymentMethod {
public function processPayment($amount) {
echo "Processing credit card payment for $amount";
}
}
class PayPalPayment implements PaymentMethod {
public function processPayment($amount) {
echo "Processing PayPal payment for $amount";
}
}
function checkout(PaymentMethod $paymentMethod, $amount) {
$paymentMethod->processPayment($amount);
}
$creditCard = new CreditCardPayment();
$paypal = new PayPalPayment();
checkout($creditCard, 100); // Processing credit card payment for 100
checkout($paypal, 50); // Processing PayPal payment for 50
这些方法展示了 PHP 中实现多态的不同技术,开发者可以根据具体需求选择最适合的实现方式。







