PHP 的歷史包袱和現代面貌

PHP 從 CGI 時代(1994)就開始被用,到 2005 年之前,它是「把 HTML 和邏輯混在一起寫」的代表:

<!-- 2005 年前常見的 PHP 寫法 -->
<html>
<?php
$result = mysql_query("SELECT * FROM users WHERE id = " . $_GET['id']); // SQL injection 風險
while ($row = mysql_fetch_array($result)) {
    echo "<p>" . $row['name'] . "</p>";
}
?>
</html>

這種寫法讓 PHP 在工程師社群裡長期有「不夠嚴肅」的形象。

但 PHP 7.x(2015)到 PHP 8.x(2020+)帶來了型別系統、JIT compiler、attribute(類似 Java annotation)、nullable type、match expression——現代 PHP 的語言能力已經和 Python、Ruby 沒有量級差距。Laravel 和 Symfony 的出現,讓 PHP 後端在大型系統的架構能力上完全站得住腳。


Laravel:「最愉快的 PHP 後端體驗」

Laravel(2011)的設計目標是讓 PHP 後端「簡單卻不失強大」。Taylor Otwell 把 Ruby on Rails 的 Convention over Configuration 精神帶進 PHP,但加了更完整的生態:

// Laravel 的 Eloquent ORM — 比 ActiveRecord 更明確
class User extends Model
{
    protected $fillable = ['name', 'email'];
 
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
 
// Controller — MVC 結構清楚
class UserController extends Controller
{
    public function show(int $id): JsonResponse
    {
        $user = User::with('posts')->findOrFail($id);
        return response()->json($user);
    }
}
 
// Route — 宣告式
Route::get('/users/{id}', [UserController::class, 'show'])->middleware('auth');

Laravel 的生態廣度幾乎無敵:

  • Eloquent:ORM,語法比 Hibernate 簡潔很多
  • Artisan:CLI 工具,php artisan make:model / make:controller / make:migration 一行搞定
  • Blade:template engine,全端 server-side rendering
  • Queue / Horizon:Job queue,Redis 管理介面
  • Laravel Sail:開發環境的 Docker 封裝
  • Filament:Admin panel,比 Django Admin 功能更豐富
  • Livewire:Server-side rendering with reactivity(類似 Phoenix LiveView)
  • Reverb:官方 WebSocket server

Laravel 的缺點

  • PHP 本身是 FPM(FastCGI Process Manager)驅動——每個請求是一個獨立的 PHP process,沒有持久化 process,所以連線池、singleton 的概念和 Node.js / Python 不同
  • FPM 模式的效能上限比 Node.js / Go 低(每個請求 fork 的 overhead)
  • Swoole / RoadRunner 可以讓 PHP 跑在持久化 process 裡,解 FPM 的效能問題,但學習成本和部署複雜度增加

適合:全功能 web 應用(特別是需要後台管理介面);PHP 為主的團隊;快速 MVP;proto proto2661047/b2e/rails 有類似設計模式的參考。


Symfony:組件化設計的典範

Symfony(2005)的定位和 Laravel 不同——它更像是「一組高品質的 PHP 組件」,而不是一個整合好的框架:

// Symfony 的 Controller
class UserController extends AbstractController
{
    #[Route('/users/{id}', name: 'user_show', methods: ['GET'])]
    public function show(int $id, UserRepository $userRepo): JsonResponse
    {
        $user = $userRepo->find($id) ?? throw $this->createNotFoundException();
        return $this->json($user);
    }
}

Symfony 的特別之處是:Laravel 本身的很多組件就是基於 Symfony 的(HTTP foundation、Console、Event Dispatcher)。在 PHP 生態裡,Symfony 是基礎建設層,Laravel 是在上面加的 DX 層。

Symfony 的強項

  • 設計非常嚴謹,適合大型複雜系統
  • DI container(Symfony DI)是 PHP 生態裡最強的
  • Doctrine ORM 比 Eloquent 更適合複雜的 domain model(Data Mapper vs Active Record)

適合:大型企業系統;需要嚴謹架構的場景;已經有 Symfony 技術棧的團隊。


Slim:PHP 的 Express 對應版

Slim(2011)是 PHP 生態的 minimal framework——只給你路由和 middleware,其他都自己來:

$app = AppFactory::create();
 
$app->addBodyParsingMiddleware();
 
$app->get('/users/{id}', function (Request $request, Response $response, array $args) {
    $id = $args['id'];
    $data = ['id' => $id, 'name' => 'Alice'];
    $response->getBody()->write(json_encode($data));
    return $response->withHeader('Content-Type', 'application/json');
});
 
$app->run();

Slim 遵守 PSR-7(HTTP message interface)和 PSR-15(middleware),和 PHP 生態的標準完全相容。

適合:API microservice;不需要全套 MVC;需要 PHP 但不想要 Laravel / Symfony 的重量。


選擇決策

需要完整的 web 應用(含後台管理、ORM、Queue、全端)?
  → Laravel

大型企業系統、嚴謹架構、複雜 domain model?
  → Symfony

Minimal API 或 microservice?
  → Slim

需要突破 FPM 效能限制?
  → Laravel / Slim + Swoole 或 RoadRunner

PHP 在 2026 的定位已經和 2005 年完全不同。Laravel 特別在「開箱就有完整生態」這個維度上,是所有語言的框架裡數一數二的選擇——前提是你願意接受 PHP 和 FPM 的限制。


延伸閱讀