ThinkPHP 3.2 引入 PHP 5.3 命名空間,徹底解決類庫衝突,並實現高效的 PSR-0 風格自動載入。本文梳理核心規則與常見用法。
命名空間路徑 + 類名.class.phpThinkPHP/Library/ 下的一級子目錄自動成為根命名空間(如 Org、Com、自建 My)Home\Model、Admin\Event)// 文件:ThinkPHP/Library/Org/Util/File.class.php
namespace Org\Util;
class File { }
// 實例化(注意前導 \ 表示全域空間)
$file = new \Org\Util\File();
在 Library/ 下新建 My/ 目錄:
// ThinkPHP/Library/My/Test.class.php
namespace My;
class Test {
public function sayHello() { echo 'hello'; }
}
// 直接使用,無需 import
$t = new \My\Test();
$t->sayHello();
| 類別 | 命名空間 | 文件路徑 |
|---|---|---|
| 模型 | Home\Model | Application/Home/Model/UserModel.class.php |
| 邏輯 | Home\Logic | Application/Home/Logic/UserLogic.class.php |
| 控制器 | Home\Controller | Application/Home/Controller/UserController.class.php |
| 事件 | Admin\Event | Application/Admin/Event/UserEvent.class.php |
若團隊不習慣命名空間,可在配置中關閉:
'APP_USE_NAMESPACE' => false,
此時應用類庫無需 namespace 宣告,但繼承核心類仍需完整命名空間:
class UserModel extends \Think\Model { }
必須加前導 \ 避免被當成當前命名空間下的類:
$obj = new \stdClass(); $xml = new \SimpleXmlElement($xmlstr); $redis = new \Redis(); // 第三方擴展同理
new \Home\Model\UserModelHome\Model → 模組 Home、層 ModelApplication/Home/Model/UserModel.class.php| 現象 | 原因 | 修正 |
|---|---|---|
| Class 'Home\Model\UserModel' not found | 文件名大小寫不符(Linux 區分大小寫) | 文件必須為 UserModel.class.php,類名 UserModel |
| Namespace declaration statement has to be the very first statement | 文件開頭有空白或 BOM | 確保 <?php 緊跟 namespace |
| 第三方類報錯 | 未加前導 \ | new \Vendor\Class() |
ThinkPHP 命名空間設計遵循「目錄即命名空間」直覺原則,配合 DEFAULT_*_LAYER 配置極具彈性。掌握「根命名空間自動識別、模組命名空間約定、關閉選項、內建類前導 \」四大要點,即可暢行無阻。