SOLID 原则
理解 PHP 中的 SOLID 原则
单一职责原则(SRP)
一个类应该只有一个改变的原因。
// Bad
class User {
public function saveUser($data) { /* ... */ }
public function generateReport() { /* ... */ }
public function sendEmail() { /* ... */ }
}
// Good
class User {
public function save($data) { /* ... */ }
}
class UserReportGenerator {
public function generate() { /* ... */ }
}
class UserNotifier {
public function sendEmail() { /* ... */ }
}开放/封闭原则(OCP)
软件实体应该对扩展开放,对修改关闭。
// Bad
class PaymentProcessor {
public function processPayment($type) {
if ($type === 'credit') {
// Process credit payment
} elseif ($type === 'debit') {
// Process debit payment
}
}
}
// Good
interface PaymentMethod {
public function processPayment();
}
class CreditPayment implements PaymentMethod {
public function processPayment() { /* ... */ }
}
class DebitPayment implements PaymentMethod {
public function processPayment() { /* ... */ }
}里氏替换原则 (LSP)
子类型必须可以替代其基类型。
// Bad
class Bird {
public function fly() { /* ... */ }
}
class Penguin extends Bird {
public function fly() {
throw new Exception("Cannot fly");
}
}
// Good
interface Flyable {
public function fly();
}
class Bird {
public function eat() { /* ... */ }
}
class Sparrow extends Bird implements Flyable {
public function fly() { /* ... */ }
}
class Penguin extends Bird {
public function swim() { /* ... */ }
}接口隔离原则 (ISP)
客户端不应被迫依赖他们不使用的接口。
// Bad
interface Worker {
public function work();
public function eat();
public function sleep();
}
// Good
interface Workable {
public function work();
}
interface Eatable {
public function eat();
}
interface Sleepable {
public function sleep();
}
class Human implements Workable, Eatable, Sleepable {
public function work() { /* ... */ }
public function eat() { /* ... */ }
public function sleep() { /* ... */ }
}
class Robot implements Workable {
public function work() { /* ... */ }
}依赖倒置原则 (DIP)
高级模块不应该依赖于低级模块。两者都应该依赖于抽象。
// Bad
class UserService {
private MySQLDatabase $database;
public function __construct() {
$this->database = new MySQLDatabase();
}
}
// Good
interface DatabaseInterface {
public function query($sql);
}
class UserService {
private DatabaseInterface $database;
public function __construct(DatabaseInterface $database) {
$this->database = $database;
}
}
class MySQLDatabase implements DatabaseInterface {
public function query($sql) { /* ... */ }
}
class PostgreSQLDatabase implements DatabaseInterface {
public function query($sql) { /* ... */ }
}这些原则有助于创建可维护、灵活且强大的代码。遵循 SOLID 可让您的代码更易于测试、修改和扩展。