標籤:style blog color 使用 strong 檔案
1.命名空間自動載入
在3.2版本中不需要手動載入類庫檔案,可以很方便的完成自動載入。
系統可以根據類的命名空間自動定位到類庫檔案,例如定義了一個類Org\Util\Auth類:
namespace Org\Util;class Auth {}
儲存到ThinkPHP/Library/Org/Util/Auth.class.php
這樣我們就可以直接執行個體化了,
new \Org\Util\Auth();
執行個體化之後系統會自動載入
ThinkPHP/Library/Org/Util/Auth.class.php
架構Liberary目錄下的命名空間都可以自動識別和定位,如下
Library 架構類庫目錄
│ ├─Think 核心Think類庫包目錄
│ ├─Org Org類庫包目錄
│ ├─ ... 更多類庫目錄
Library目錄下的子目錄都是一個根命名空間,就是說Think,Org下的類都可以自動載入
new Think\Cache\Driver\File();new Org\Util\Auth();new Org\Io\File();
都可以自動載入對應的類庫檔案。
我們還可以在Liberary目錄下面任意增加新的目錄,就會自動註冊成為一個新的根命名空間,如下:
‘AUTOLOAD_NAMESPACE‘ => array( ‘My‘ => THINK_PATH.‘My‘, ‘One‘ => THINK_PATH.‘One‘,)
配置了上面的AUTOLOAD_NAMESPACE之後可以執行個體化下面的類庫
new My\Net\IpLocation();new One\Util\Log();
自動載入下面的類庫檔案
ThinkPHP/My/Net/IpLocation.class.php
ThinkPHP/One/Util/Log.class.php
如果命名空間不在Library目錄下面,並且沒有定義對應的AUTO_LOADNAMESPACE參數的話則會當做模組的命名空間自動載入,例如
new Home\Model\UserModel();new Home\Event\UserEvent();
這跳躍有點大,剛才講的還是Liberary下的命名空間,現在又扯到Application下的。
由於ThinkPHP/Library目錄下面不存在Home目錄,也沒在AUTOLOAD_NAMESPACE參數定義Home命名空間,所以就把Home當成模組命名空間來識別,所以會自動載入
Application/Home/Model/UserModel.class.phpApplication/Home/Event/UserEvent.class.php
這些命名空間貌似都是ThinkPHP\Liberary目錄下的,這個目錄下的東西一般不會修改的啊,不明白為什麼沒有說Application目錄下的命名空間。
2.類庫映射
定義了較多的命名空間效率會有所影響,可以給常用的類庫定義類庫映射,命名空間映射相當於給類檔案定義了一個別名,例如:
Think\Think::addMap(‘Think\Log‘,THINK_PATH.‘Think\Log.php‘);Think\Think::addMap(‘Org\Util\Array‘,THINK_PATH.‘Org\Util\Array.php‘);
那這段應該寫在哪裡呢,文檔沒有說清楚。也可使用addMap方法大量匯入類庫映射定義,如下:
$map = array(‘Think\Log‘=>THINK_PATH.‘Think\Log.php‘,‘Org\Util\Array‘=>THINK_PATH.‘Org\Util\Array.php‘);Think\Think::addMap($map);
文檔中依舊沒有說明這段應該寫在什麼地方,是config.php還是入口檔案裡呢,捉急啊。
3.類庫載入的優先順序
在實際的類庫載入過程中,往往會涉及到自動載入優先順序的問題,以Test\MyClass為例,自動載入的優先順序順序如下:
1.判斷是否註冊了Test\MyClass類庫映射,如果有則自動載入類庫映射定義的檔案,
2.判斷是否存在Liberary\Test目錄,有則以該目錄為初始目錄載入
3.判斷是否註冊了Test根命名空間,有則以註冊的目錄為初始目錄載入
4.以上都不成立則以Test模組模組經行初始目錄載入,
4.手動載入第三方類庫
使用第三方類庫的時候可能出現以下情況,不符合ThinkPHP命名空間和尾碼,沒有使用命名空間或者命名空間和路徑不一致,我們可以使用手動匯入的方式載入。
我們使用import方法匯入類庫,如下:
// 匯入Org類庫包Library/Org/Util/Date.class.php類庫import("Org.Util.Date");// 匯入Home模組下面的 Application/Home/Util/UserUtil.class.php類庫import("Home.Util.UserUtil");// 匯入當前模組下面的類庫 import("@.Util.Array");// 匯入Vendor類庫包 Library/Vendor/Zend/Server.class.phpimport(‘Vendor.Zend.Server‘);
對於import方法,系統會自動識別匯入類庫檔案的位置,ThinkPHP可以自動識別的類庫包括Think,Org,Com,Behavior,Vendor,以及Liberary目錄下的子目錄,這不扯犢子啊,Think,Org,Com,Behavior,Vendor就在ThinkPHP\Liberary下,文檔中所說的Liberary目錄是指那個目錄呢?哦,有可能文檔中所說的是Liberary目錄下自己建立的目錄,有可能。
如果在Liberary目錄下建立了一個Test目錄,並建立了一個UserTest.class.php檔案可以這樣匯入:
import(‘Test.UserTest‘);
注意如果沒有使用namespace來定義命名空間的話,執行個體化的時候需要使用根命名空間,如下:
import(‘Test.UserTest‘);$test = new \UserTest();
按照系統規則,import方法是無法匯入具有點號的類庫檔案,因為點號會直接轉化為斜線,例如如果我們定義了一個User.Info.class.php檔案的話採用import("Org.User.Info");方式載入就會出現錯誤,導致我們載入到的不是Org/User.Info.class.php檔案,而是Org/User/Info.class.php檔案,這種情況下我們使用import("Org.User#Info");方式匯入,這個就是說檔案名稱中的點號用#代替。
大多數情況下import可以自動識別匯入類庫檔案的位置,特殊情況下需要第二個參數來指定起始匯入的路徑,例如:要匯入當前檔案所在目錄下的RBAC/AccessDecisionManager.class.php 檔案,可以使用import("RBAC.AccessDecisionManager",dirname(__FILE__)); 。 如果要匯入的檔案尾碼不是class.php而是.php,可以使用第三個參數import("RBAC.AccessDecisionManager",dirname(__FILE__),".php");
如果第三方的類庫放在Vendor目錄下,以.php為檔案尾碼,也沒有採用命名空間可以採用系統內部的Vendor函數簡化匯入,例如我們要把Zend的Filter\Dir.php放到Vendor目錄下面,這個時候Dir檔案的路徑就是Vendor\Zend\Filter\Dir.php,使用Vendor方法匯入如下:
Vendor(‘Zend.Filter.Dir‘);
Vendor方法也可以支援和import一樣的基礎路徑和檔案尾碼參數,如下:
Vendor(‘Zend.Filter.Dir‘,dirname(__FILE__),‘.class.php‘);
感覺高上大的,這些貌似是對系統進行擴充的時候使用的比較多。