thinkphp學習筆記9—自動載入

來源:互聯網
上載者:User

標籤: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目錄下的命名空間都可以自動識別和定位,如下

  1. Library 架構類庫目錄
  2. │ ├─Think 核心Think類庫包目錄
  3. │ ├─Org Org類庫包目錄
  4. │ ├─ ... 更多類庫目錄

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‘);

 

感覺高上大的,這些貌似是對系統進行擴充的時候使用的比較多。

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.