PHP 5.3 引入命名空間前,所有類、函數、常量都在全局空間,導致類名衝突頻發。開發者被迫用長前綴(如 MyProject_Database_Connection)避免衝突,代碼冗長且難維護。命名空間提供了**層級隔離機制**,類似文件系統目錄,徹底解決命名衝突,並為 PSR-4 自動加載奠定基礎。
子命名空間
namespace MyProject\Blog\Auth\Handler\Social; class Twitter {}同一文件多命名空間(不推薦)
導入與別名
名稱解析規則
| 調用方式 | 示例 | 解析結果(當前命名空間:A\B) |
|---|---|---|
| 非限定名 | Foo::bar() | A\B\Foo::bar() |
| 限定名 | C\Foo::bar() | A\B\C\Foo::bar() |
| 完全限定名 | \C\Foo::bar() | C\Foo::bar()(從全局空間開始) |
$class = 'MyProject\Database\Connection'; $conn = new $class(); // 需完全限定名 // 字符串中反斜杠需轉義 $ns = 'MyProject\\Database'; $class = $ns . '\\Connection';
__NAMESPACE__:當前命名空間字符串(全局空間為空字符串)namespace\ClassName:相當於 self,引用當前命名空間下的類// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Vendor\\Package\\": "packages/vendor/package/src/"
}
}
}
目錄結構映射:App\Controller\UserController → src/Controller/UserController.php
App\
├── Domain\
│ ├── Entity\
│ ├── ValueObject\
│ ├── Repository\ (接口)
│ └── Service\
├── Application\
│ ├── Command\
│ ├── Query\
│ └── Handler\
├── Infrastructure\
│ ├── Persistence\ (Repository 實現)
│ ├── ExternalApi\
│ └── Messaging\
└── Presentation\
├── Http\Controller\
├── Console\Command\
└── GraphQL\Resolver\
3. 內部類與匿名類結合
namespace App\Payment; class Gateway { public function createProcessor(string $type): ProcessorInterface { return new class($this->config) implements ProcessorInterface { public function __construct(private array $config) {} public function charge(int $amount): bool { /* ... */ } }; } }常見錯誤與避坑
| 錯誤 | 現象 | 修正 |
|---|---|---|
| 命名空間聲明前有輸出 | Namespace declaration statement has to be the very first statement | 移除前置空白、BOM、HTML、echo |
| use 導入在函數內部 | 語法錯誤 | 導入語句必須在頂層作用域 |
| 動態實例化缺少反斜杠 | 實例化到當前命名空間下 | 確保變量包含完全限定名 \Full\Class |
| 併發 require 導致重複聲明 | Cannot declare class... | 使用 require_once 或 Composer 自動加載 |
命名空間是現代 PHP 專業開發的基石。掌握 聲明規則、導入別名、解析優先級、PSR-4 映射、動態調用,結合 DDD 分層架構,能構建清晰、可擴展、無衝突的代碼庫。記住核心原則:**每個文件一個命名空間、嚴格遵循 PSR-4、善用別名化解衝突、動態調用補全反斜杠**。