php复习
除了接口(Interface),PHP 中还有一些类似的概念和机制,可以帮助你实现多态性和代码复用。以下是一些常见的替代方案:
1. 抽象类(Abstract Class)
抽象类是一种介于普通类和接口之间的概念。它可以包含抽象方法(只有声明没有实现的方法)和具体方法(有实现的方法)。抽象类不能被实例化,只能被继承。
特点:
- 部分实现:可以提供部分方法的实现,子类可以选择性地覆盖这些方法。
- 强制实现:子类必须实现抽象类中的所有抽象方法。
- 多继承限制:一个类只能继承一个抽象类。
示例:
abstract class Animal {
abstract public function makeSound();
public function eat() {
return "Eating...";
}
}
class Dog extends Animal {
public function makeSound() {
return "Woof";
}
}
class Cat extends Animal {
public function makeSound() {
return "Meow";
}
}
$dog = new Dog();
echo $dog->makeSound(); // 输出: Woof
echo $dog->eat(); // 输出: Eating...
$cat = new Cat();
echo $cat->makeSound(); // 输出: Meow
echo $cat->eat(); // 输出: Eating...
2. Trait(特性)
Trait 是一种代码重用的机制,允许你在多个类中重用一组方法。Trait 提供了具体的方法实现,而不仅仅是方法签名。
特点:
- 代码重用:可以在多个类中重用一组方法的具体实现。
- 组合:一个类可以使用多个 Trait。
- 方法冲突:可以通过
insteadof
和as
关键字解决方法冲突。
示例:
trait Flyable {
public function fly() {
return "I can fly!";
}
}
class Bird {
use Flyable;
}
class Airplane {
use Flyable;
}
$bird = new Bird();
echo $bird->fly(); // 输出: I can fly!
$airplane = new Airplane();
echo $airplane->fly(); // 输出: I can fly!
3. 接口(Interface)
接口是一种定义方法签名但不提供具体实现的机制。类可以实现一个或多个接口,从而承诺实现接口中定义的所有方法。
特点:
- 多态性:允许多个类实现相同的接口,从而实现多态性。
- 契约:定义了一个契约,任何实现该接口的类都必须遵守这个契约。
示例:
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
return "Woof";
}
}
class Cat implements Animal {
public function makeSound() {
return "Meow";
}
}
$dog = new Dog();
echo $dog->makeSound(); // 输出: Woof
$cat = new Cat();
echo $cat->makeSound(); // 输出: Meow
4. 委托(Delegation)
委托是一种设计模式,其中一个类将某些职责委托给另一个类来处理。这可以通过构造函数注入或属性设置来实现。
特点:
- 职责分离:将某些职责委托给其他对象,保持类的单一职责原则。
- 灵活性:可以在运行时动态改变委托对象。
示例:
class SoundMaker {
public function makeSound() {
return "Generic sound";
}
}
class Dog {
private $soundMaker;
public function __construct(SoundMaker $soundMaker) {
$this->soundMaker = $soundMaker;
}
public function makeSound() {
return $this->soundMaker->makeSound() . " Woof";
}
}
$soundMaker = new SoundMaker();
$dog = new Dog($soundMaker);
echo $dog->makeSound(); // 输出: Generic sound Woof
总结
- 抽象类:适用于提供部分实现,并强制子类实现某些方法。
- Trait:适用于代码重用,允许多个 Trait 组合在一个类中。
- 接口:适用于定义一组类必须遵守的契约,实现多态性。
- 委托:适用于职责分离,提高代码的灵活性和可维护性。
通过合理使用这些机制,可以使你的代码更加模块化、可维护和易于扩展。