为什么PHP在企业级领域仍然占据主导地位,以及如何避免出丑
\n\n当听到“PHP”时,第一反应是花一个晚上搭建的落地页或WordPress上的简单博客。但打开大型银行、零售商或电信公司的招聘信息——那里有大量PHP开发人员的职位。这可不是关于“快速拼凑代码”。这是——企业级PHP。一个拥有自身规则、架构模式和代码审查文化的完整行业。
\n\n在大型公司中进行PHP开发与在初创公司中有什么不同?你不仅仅是编写“能运行的代码”。你是在构建一个必须运行多年、经历数十次发布并承受数千用户负载的系统。在本文中,我将剖析企业级PHP开发的关键特点:从架构到部署。会有大量代码、实用建议,并且尽可能少说废话。
\n\n架构:SOLID、分层,没有魔法
\n\n在企业级开发中,第一条规则是代码必须可预测且易于测试。这里不允许“我在这里快速在控制器中写个查询”。在大型项目中,你必须遵循SOLID原则,并在各层之间清晰划分职责。
\n\n典型的企业级PHP应用程序架构如下:
\n\n- \n
- 表示层 — 控制器、路由、中间件。 \n
- 应用层 — 服务、DTO、命令/处理程序(CQRS)。 \n
- 领域层 — 实体、值对象、仓库(接口)。 \n
- 基础设施层 — ORM、外部API、缓存、队列。 \n
以下是实际示例。与其直接在控制器中编写SQL:
\n\n// ❌ 不好:混合各层\nclass OrderController {\n public function create(Request $request) {\n $db = new PDO('mysql:...');\n $db->exec("INSERT INTO orders (user_id, total) VALUES ({$request->get('user_id')}, {$request->get('total')})");\n return new JsonResponse(['status' => 'ok']);\n }\n}\n\n在企业级开发中,你会看到类似这样的代码:
\n\n// ✅ 好:职责分离\nclass OrderController {\n public function __construct(\n private OrderService $orderService\n ) {}\n\n public function create(CreateOrderRequest $request): JsonResponse {\n $dto = new CreateOrderDTO(\n userId: $request->getUserId(),\n total: $request->getTotal()\n );\n\n $order = $this->orderService->createOrder($dto);\n\n return new JsonResponse(['id' => $order->getId()]);\n }\n}\n\nclass OrderService {\n public function __construct(\n private OrderRepositoryInterface $orderRepository,\n private EventDispatcher $eventDispatcher\n ) {}\n\n public function createOrder(CreateOrderDTO $dto): Order {\n $order = new Order($dto->userId, $dto->total);\n $this->orderRepository->save($order);\n $this->eventDispatcher->dispatch(new OrderCreatedEvent($order));\n return $order;\n }\n}\n\n看到区别了吗?第二个版本可以测试、重用且易于修改。这就是企业级PHP——代码不仅运行,而且是经过设计的。
\n\n值对象和严格类型化
\n\n在大型项目中,你不会在参数中看到string $email。相反,会使用值对象。这是自文档化的代码,可以在编译阶段防止错误。
class Email {\n public function __construct(private string $value) {\n if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {\n throw new \\InvalidArgumentException('Invalid email');\n }\n }\n\n public function getValue(): string {\n return $this->value;\n }\n}\n\nclass User {\n public function __construct(\n private UserId $id,\n private Email $emai