TP5學習筆記一 名稱空間
ThinkPHP5
採用名稱空間方式定義和自動載入類庫檔案,有效的解決了多模組和Composer
類庫之間的名稱空間衝突問題,並且實現了更加高效的類庫自動載入機制。
如果不清楚名稱空間的基本概念,可以參考PHP手冊:PHP名稱空間
特別注意的是,如果你需要呼叫PHP內建的類庫,或者第三方沒有使用名稱空間的類庫,記得在例項化類庫的時候加上
\
,例如:// 錯誤的用法 $class = new stdClass(); $xml = new SimpleXmlElement($xmlstr); // 正確的用法 $class = new \stdClass(); $xml = new \SimpleXmlElement($xmlstr);
在ThinkPHP5.0
中,只需要給類庫正確定義所在的名稱空間,並且名稱空間的路徑與類庫檔案的目錄一致,那麼就可以實現類的自動載入,從而實現真正的惰性載入。
例如,\think\cache\driver\File
類的定義為:
namespace think\cache\driver;
class File
{
}
如果我們例項化該類的話,應該是:
$class = new \think\cache\driver\File();
系統會自動載入該類對應路徑的類檔案,其所在的路徑是 thinkphp/library/think/cache/driver/File.php
。
5.0預設的目錄規範是小寫,類檔案命名是駝峰法,並且首字母大寫。
原則上,可以支援駝峰法命名的目錄,只要名稱空間定義和目錄一致即可,例如:
我們例項化
$class = new \Think\Cache\Driver\File();
系統則會自動載入 thinkphp/library/Think/Cache/Driver/File.php
檔案。
根名稱空間(類庫包)
根名稱空間是一個關鍵的概念,以上面的\think\cache\driver\File
類為例,think
就是一個根名稱空間,其對應的初始名稱空間目錄就是系統的類庫目錄(thinkphp/library/think
),我們可以簡單的理解一個根名稱空間對應了一個類庫包。
系統內建的幾個根名稱空間(類庫包)如下:
名稱 | 描述 | 類庫目錄 |
---|---|---|
think | 系統核心類庫 | thinkphp/library/think |
traits | 系統Trait類庫 | thinkphp/library/traits |
app | 應用類庫 | application |
如果需要增加新的根名稱空間,有兩種方式:註冊新的根名稱空間或者放入EXTEND_PATH
目錄(自動註冊)。
請注意本手冊中的示例程式碼為了簡潔,如無指定類庫的名稱空間的話,都表示指的是
think
名稱空間,例如下面的程式碼:
Route::get('hello','index/hello');
請自行新增 use think\Route
或者使用
\think\Route::get('hello','index/hello');
自動註冊
我們只需要把自己的類庫包目錄放入EXTEND_PATH
目錄(預設為extend
,可配置),就可以自動註冊對應的名稱空間,例如:
我們在extend
目錄下面新增一個my
目錄,然後定義一個\my\Test
類( 類檔案位於extend/my/Test.php
)如下:
namespace my;
class Test
{
public function sayHello()
{
echo 'hello';
}
}
我們就可以直接例項化和呼叫:
$Test = new \my\Test();
$Test->sayHello();
如果我們在應用入口檔案中重新定義了EXTEND_PATH
常量的話,還可以改變\my\Test
類檔案的位置,例如:
define('EXTEND_PATH','../vendor/');
那麼\my\Test
類檔案的位置就變成了/vendor/my/File.php
。
'..' 是應為入口在public下
手動註冊
也可以通過手動註冊的方式註冊新的根名稱空間,例如:
在應用入口檔案中新增下面的程式碼:
\think\Loader::addNamespace('my','../application/extend/my/');
如果要同時註冊多個根名稱空間,可以使用:
\think\Loader::addNamespace([
'my' => '../application/extend/my/',
'org' => '../application/extend/org/',
]);
也可以直接在應用的配置檔案中新增配置,系統會在應用執行的時候自動註冊。
'root_namespace' => [
'my' => '../application/extend/my/',
'org' => '../application/extend/org/',
]
應用類庫包
為了避免和Composer
自動載入的類庫存在衝突 ,應用類庫的名稱空間的根都統一以app
命名,例如:
namespace app\index\model;
class User extends \think\Model
{
}
其類檔案位於 application/index/model/User.php
。
namespace app\admin\event;
class User
{
}
其類檔案位於 application/admin/event/User.php
。
如果覺得app
根名稱空間不合適或者有衝突,可以在應用配置檔案中修改:
'app_namespace' => 'application',
定義後,應用類庫的名稱空間改為:
namespace application\index\model;
class User extends \think\Model
{
}
名稱空間別名
框架允許給名稱空間定義別名,例如:
namespace app\index\model;
use think\Model;
class User extends Model
{
}
原來在控制器裡面呼叫方式為:
namespace app\index\controller;
use app\index\model\User;
class Index
{
public function index()
{
$user = new User();
}
}
如果我們在應用公共檔案中註冊名稱空間別名如下:
\think\Loader::addNamespaceAlias('model','app\index\model');
那麼,上面的控制器程式碼就可以更改為:
namespace app\index\controller;
use model\User;
class Index
{
public function index()
{
$user = new User();
}
}
相關文章
- OpenCV 名稱空間學習筆記OpenCV筆記
- TypeScript學習筆記(三)泛型、模組化和名稱空間TypeScript筆記泛型
- 名稱空間
- PHP名稱空間PHP
- PHP 名稱空間PHP
- 20200109 - 名稱空間
- python名稱空間Python
- vuex名稱空間Vue
- 機器學習-學習筆記(一) --> (假設空間 & 版本空間)及 歸納偏好機器學習筆記
- C#學習 [型別系統] 名稱空間(12)C#型別
- 15-名稱空間
- Python名稱空間包Python
- 11. 名稱空間
- ts---名稱空間
- C++名稱空間C++
- go 學習筆記之工作空間Go筆記
- 使用p名稱空間和c名稱空間的XML快捷方式XML
- Python中名稱空間是什麼?名稱空間生命週期是多久?Python
- ros節點名稱空間ROS
- PHP 核心特性 - 名稱空間PHP
- Kubernetes 名稱空間入門
- 3-1 名稱空間
- 什麼是名稱空間?
- thinkphp TP5框架名稱空間控制器繼承無效,給大家梳理一下PHP框架繼承
- 對名稱空間的一點個人理解
- Python作用域和名稱空間Python
- spring框架中的名稱空間Spring框架
- System.Security.Cryptography 名稱空間
- c++系列:匿名名稱空間C++
- 利用Kubernetes名稱空間來管理記憶體和CPU資源(一)記憶體
- C++ 動態記憶體分配與名稱空間C++記憶體
- 內聯和巢狀名稱空間巢狀
- Python中名稱空間包簡介Python
- PHP 物件導向 (三)名稱空間PHP物件
- php名稱空間的呼叫順序PHP
- 瞭解下C# 名稱空間(Namespace)C#namespace
- C++系列: 巢狀名稱空間C++巢狀
- PHP 獲取不帶名稱空間的類名PHP