为什么架构决定一切(你的咖啡再也不会凉了)
\n想象一下你在盖房子。你可以随意堆砌砖块,用口香糖粘合,指望它能撑到冬天。但也可以精心设计地基、墙壁和屋顶,让房子能抵御飓风和亲戚的突然造访。在PHP的世界里,道理完全相同。架构模式就是那些蓝图,能将你的代码从“能用就行”转变为“运行良好、可扩展、不会让人想喝碘酒”。
\n当我刚开始用PHP编码时,我的项目都是庞大的单体应用。在同一个index.php文件里,SQL查询、HTML布局和业务逻辑挤在一起。这种写法一直能工作,直到客户要求添加新功能。然后就是地狱般的日子。今天,我将向你们展示如何避免这种地狱。我们将剖析PHP中的关键架构模式——从经典到现代方法。开始吧!
MVC(模型-视图-控制器):所有模式之祖
\n如果你用过Laravel、Symfony或Yii2,你一定遇到过MVC。这是PHP的基础架构模式,它将应用分为三部分:
\n- \n
- Model(模型) — 数据和业务逻辑(数据库操作、验证、计算)。 \n
- View(视图) — 显示(HTML、模板、JSON)。 \n
- Controller(控制器) — 纽带:接收请求,调用模型,并将数据传递给视图。 \n
MVC解决了主要问题——职责分离。HTML中再也不会有SQL。代码变得可读、可测试、可维护。
\n\n纯PHP的MVC示例
\n// Model: User.php\nclass User {\n public function find(int $id): ?array {\n $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n $stmt->execute([$id]);\n return $stmt->fetch() ?: null;\n }\n}\n\n// Controller: UserController.php\nclass UserController {\n public function show(int $id): void {\n $userModel = new User();\n $user = $userModel->find($id);\n if (!$user) {\n http_response_code(404);\n echo '用户未找到';\n return;\n }\n // 将数据传递给视图\n require 'views/user.php';\n }\n}\n\n// View: views/user.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n<p>邮箱: <?= htmlspecialchars($user['email']) ?></p>\n何时使用:适用于中等复杂度的Web应用。如果你有一个简单的博客或电商网站,MVC是你的选择。但要小心:如果控制器变得臃肿(Fat Controllers),模式就失去了意义。
\n\nActive Record:简单与速度
\nActive Record模式是指对象同时代表数据库中的一行和业务逻辑。还记得Laravel Eloquent或Yii2 ActiveRecord吗?就是它。每个模型既是数据库查询,又是验证规则和关联关系。
\n\nActive Record示例(Eloquent风格)
\nclass User extends ActiveRecord {\n // 属性对应表的列\n public int $id;\n public string $name;\n public string $email;\n\n public function save(): bool {\n // INSERT/UPDATE逻辑\n if ($this->id) {\n // UPDATE\n } else {\n // INSERT\n }\n return true;\n }\n\n public static function find(int $id): ?self {\n // SELECT * FROM users WHERE id = $id\n }\n}\n\n// 使用\n$user = new User();\n$user->name = '伊万';\n$user->email = 'ivan@example.com';\n$user->save(); // 简单明了\n优点:编写速度快,对新手直观易懂。缺点:违反了单一职责原则(SOLID中的Single Responsibility)。模型既了解数据,又知道如何保存数据。对于复杂的项