企业级PHP:大公司如何编写代码

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么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
\n\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。相反,会使用值对象。这是自文档化的代码,可以在编译阶段防止错误。

\n\n
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                

博客

书籍推荐