<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                3.2提供了靈活的擴展機制,相對于3.1版本來說,則變得更加簡單。 首先,要了解ThinkPHP有哪些擴展方式: - 配置擴展 - 函數擴展 - 類庫擴展 - 行為擴展 - 驅動擴展(緩存、數據庫、日志、session、上傳、模板引擎、圖像、存儲) - 模型擴展 - 標簽庫擴展 - 應用模式擴展 - 控制器擴展 - Widget擴展 # 類庫擴展 ThinkPHP的類庫主要包括公共類庫和應用類庫,都是基于命名空間進行定義和擴展的。只要按照規范定義,都可以實現自動加載。 ## 公共類庫 公共類庫通常是指`ThinkPHP/Library`目錄下面的類庫,例如: ~~~ Think目錄:系統核心類庫 Org目錄:第三方公共類庫 ~~~ 這些目錄下面的類庫都可以自動加載,你只要把相應的類庫放入目錄中,然后添加或者修改命名空間定義。 你可以在Org/Util/目錄下面添加一個Image.class.php 文件,然后添加命名空間如下: ~~~ namespace Org\Util; class Image { } ~~~ 這樣,就可以用下面的方式直接實例化Image類了: ~~~ $image = new \Org\Util\Image; ~~~ 除了這些目錄之外,你完全可以在`ThinkPHP/Library`目錄下面添加自己的類庫目錄,例如,我們添加一個Com目錄用于企業類庫擴展: Com\Sina\App類(位于Com/Sina/App.class.php ) ~~~ namespace Com\Sina; class App { } ~~~ Com\Sina\Rank類(位于Com/Sina/Rank.class.php) ~~~ namespace Com\Sina; class Rank { } ~~~ 公共類庫除了在系統的Library目錄之外,還可以自定義其他的命名空間,我們只需要注冊一個新的命名空間,在應用或者模塊配置文件中添加下面的設置參數: ~~~ 'AUTOLOAD_NAMESPACE' => array( 'Lib' => APP_PATH.'Lib', ) ~~~ 我們在應用目錄下面創建了一個Lib目錄用于放置公共的Lib擴展,如果我們要把上面兩個類庫放到Lib\Sina目錄下面,只需要調整為: Lib\Sina\App類(位于Lib/Sina/App.class.php ) ~~~ namespace Lib\Sina; class App { } ~~~ Lib\Sina\Rank類(位于Lib/Sina/Rank.class.php) ~~~ namespace Lib\Sina; class Rank { } ~~~ 如果你的類庫沒有采用命名空間的話,需要使用import方法先加載類庫文件,然后再進行實例化,例如: 我們定義了一個Counter類(位于Com/Sina/Util/Counter.class.php): ~~~ class Counter { } ~~~ 在使用的時候,需要按下面方式調用: ~~~ import('Com.Sina.Util.Couter'); $object = new \Counter(); ~~~ ## 應用類庫 應用類庫通常是在應用或者模塊目錄下面的類庫,應用類庫的命名空間一般就是模塊的名稱為根命名空間,例如: Home\Model\UserModel類(位于Application\Home\Model) ~~~ namespace Home\Model; use Think\Model; class UserModel extends Model{ } ~~~ Common\Util\Pay類(位于Application\Common\Util) ~~~ namespace Common\Util; class Pay { } ~~~ Admin\Api\UserApi類(位于Application\Admin\Api) ~~~ namespace Admin\Api; use Think\Model; class UserApi extends Model{ } ~~~ > 記住一個原則,命名空間的路徑和實際的文件路徑對應的話 就可以實現直接實例化的時候自動加載。 # 驅動擴展 這里說的驅動擴展是一種泛指,ThinkPHP采用驅動式設計,很多功能的擴展都是基于驅動的思想,包括數據庫驅動、緩存驅動、標簽庫驅動和模板引擎驅動等。 事實上,每個類庫都可以設計自己的驅動,因此3.2版本的驅動目錄沒有獨立出來,而是放到各個類庫的命名空間下面,例如:`Think\Log`類的驅動放到 `Think\Log\Driver` 命名空間下面,`Think\Db`類的驅動放到了 `Think\Db\Driver` 命名空間下面。 > 當然,這只是建議的位置,你完全可以根據項目的需要,把自己的驅動獨立存放,例如: `Home\Driver\Cache\Sae.class.php` 則是一種把Cache驅動獨立存放的方式(內置的核心類庫都支持給驅動指定單獨的命名空間)。 # 行為擴展 行為(Behavior)是一個比較抽象的概念,你可以想象成在應用執行過程中的一個動作或者處理,在框架的執行流程中,各個位置都可以有行為產生,例如路由檢測是一個行為,靜態緩存是一個行為,用戶權限檢測也是行為,大到業務邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應用,而在外圍通過擴展或者配置來改變或者增加一些功能。 而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應用執行前,有些行為都是在模板輸出之后,我們把這些行為發生作用的位置稱之為標簽(位),當應用程序運行到這個標簽的時候,就會被攔截下來,統一執行相關的行為,類似于AOP編程中的“切面”的概念,給某一個切面綁定相關行為就成了一種類AOP編程的思想。 系統核心提供的標簽位置包括下面幾個(按照執行順序排列): ~~~ app_init 應用初始化標簽位 path_info PATH_INFO檢測標簽位 app_begin 應用開始標簽位 action_name 操作方法名標簽位 action_begin 控制器開始標簽位 view_begin 視圖輸出開始標簽位 view_parse 視圖解析標簽位 template_filter 模板內容解析標簽位 view_filter 視圖輸出過濾標簽位 view_end 視圖輸出結束標簽位 action_end 控制器結束標簽位 app_end 應用結束標簽位 ~~~ 在每個標簽位置,可以配置多個行為定義,行為的執行順序按照定義的順序依次執行。除非前面的行為里面中斷執行了(某些行為可能需要中斷執行,例如檢測機器人或者非法執行行為),否則會繼續下一個行為的執行。 行為定義: 通過Common\Conf\tags.php配置文件定義,格式如下: ~~~ <?php return array( 'action_begin'=>array('Home\\Behaviors\\test','Home\\Behaviors\\test1'),//一個標簽位可以有多個行為,使用數組即可。 // 如果是3.2.1以上版本 則需要改成 'action_begin'=>array('Home\\Behaviors\\testBehavior','Home\\Behaviors\\test1Behavior') ); ~~~ 上面注冊了兩個行為,分別是Home模塊下的test和test1行為,類文件位于Home模塊目錄下的Behaviors目錄,可以自定義目錄。 行為必須是一個包含命名空間路徑的類,如上的 Home\Behaviors\test 對應的類是 Home/Behaviors/test**Behavior**.class.php。 > 注意:注冊行為的時候行為名不需要加Behavior后綴,但是創建類文件的時候需要在行為名test后面加上Behavior,以及類文件擴展名是.class.php。 除了這些系統內置標簽之外,開發人員還可以在應用中添加自己的應用標簽。 比如在控制器的_initialize方法中: ~~~ \Think\Hook::add('action_begin','Home\\Behaviors\\test1');//同時添加多個行為,只要將第二個參數換成數組即可。 // 3.2.1以上版本 需要改成 // \Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior'); ~~~ 行為類的定義,以上面的test行為為例: ~~~ <?php namespace Home\Behaviors; class testBehavior extends \Think\Behavior{ //行為執行入口 public function run(&$param){ } } ~~~ 行為類建議繼承\Think\Behavior,必須實現run(&$param)方法,行為是通過這個方法執行的。 行為的觸發: 只要在合適的地方通過以下代碼 ~~~ \Think\Hook::listen('標簽名'[,參數]); // 或者 // tag('標簽名'[,參數]); ~~~ 當應用執行到這個地方的時候將自動觸發指定標簽名下的所有行為類。 > 注意:動態注冊的行為必須在Hook::listen之前,即:先注冊行為,才能觸發行為。 > listen方法可以傳入并且只接受一個參數,如果需要傳入多個參數,請使用數組,該參數為引用傳值,所以只能傳入變量。 參數可以被run(&$param)中的$param接收。 # 標簽庫擴展 ### 標簽庫加載 模板中加載標簽庫,預加載自定義標簽庫,擴展內置標簽庫的加載 請參考:[http://document.thinkphp.cn/manual_3_2.html#taglib](http://document.thinkphp.cn/manual_3_2.html#taglib) ### 自定義標簽庫開發注意事項 - 標簽庫請放置 ThinkPHP\Library\Think\Template\TagLib 目錄下,若需要存放在指定位置,請在加載標簽庫配置時使用命名空間,如 ~~~ <taglib name="Home\\TagLib\\MyTag"/> ~~~ - 標簽庫類請使用命名空間,否則無法加載類,主要是在類開頭包含如下代碼: ~~~ <?php namespace Think\Template\TagLib; use Think\Template\TagLib; defined('THINK_PATH') or exit(); ~~~ 自定義標簽庫位置的話,請自行修改第一行 namespace 的定義。 ### 關于標簽庫開發 暫時可以參考3.0的官方教程中關于標簽庫擴展的部分,建議自己分析內置標簽庫Cx。 # widget擴展 Widget擴展一般用于頁面組件的擴展。 舉個例子,我們在頁面中實現一個分類顯示的Widget,首先我們要定義一個Widget控制器層 CateWidget,如下: ~~~ namespace Home\Widget; use Think\Controller; class CateWidget extends Controller { public function menu(){ echo 'menuWidget'; } } ~~~ 然后,我們在模版中通過W方法調用這個Widget。 ~~~ {:W('Cate/Menu')} ~~~ 執行后的輸出結果是: menuWidget ## 傳入參數 如果需要在調用Widget的時候 使用參數,可以這樣定義: ~~~ namespace Home\Widget; use Think\Controller; class CateWidget extends Controller { public function menu($id,$name){ echo $id.':'.$name; } } ~~~ 模版中的參數調用,使用: ~~~ {:W('Cate/Menu',array(5,'thinkphp'))} ~~~ > 傳入的參數是一個數組,順序對應了menu方法定義的參數順序。 則會輸出 ~~~ 5:thinkphp ~~~ ## 模板支持 Widget可以支持使用獨立的模板,例如: ~~~ namespace Home\Widget; use Think\Controller; class CateWidget extends Controller { public function menu(){ $menu = M('Cate')->getField('id,title'); $this->assign('menu',$menu); $this->display('Cate:menu'); } } ~~~ CateWiget類渲染了一個模版文件 `View/Cate/menu.html`。 在menu.html模版文件中的用法: ~~~ <foreach name="menu" item="title"> {$key}:{$title} </foreach> ~~~ # 應用模式 應用模式提供了對核心框架進行改造的機會,可以讓你的應用適應更多的環境和不同的要求。 每個應用模式有自己的模式定義文件,用于配置當前模式需要加載的核心文件和配置文件,以及別名定義、行為擴展定義等等。根據模式定義文件的定義位置和入口是否需要定義模式,可以分為**顯式應用模式**和**隱含應用模式**。 ## 顯式應用模式 顯式應用模式的模式定義文件位于`ThinkPHP\Mode`目錄,如果我們要增加一個應用模式,只需要在該目錄下面定義一個模式定義文件即可,下面是一個典型的模式定義文件(lite.php): ~~~ return array( // 配置文件 'config' => array( THINK_PATH.'Conf/convention.php', // 系統慣例配置 CONF_PATH.'config.php', // 應用公共配置 ), // 別名定義 'alias' => array( 'Think\Exception' => CORE_PATH . 'Exception'.EXT, 'Think\Model' => CORE_PATH . 'Model'.EXT, 'Think\Db' => CORE_PATH . 'Db'.EXT, 'Think\Cache' => CORE_PATH . 'Cache'.EXT, 'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT, 'Think\Storage' => CORE_PATH . 'Storage'.EXT, ), // 函數和類文件 'core' => array( MODE_PATH.'Lite/functions.php', COMMON_PATH.'Common/function.php', MODE_PATH . 'Lite/App'.EXT, MODE_PATH . 'Lite/Dispatcher'.EXT, MODE_PATH . 'Lite/Controller'.EXT, MODE_PATH . 'Lite/View'.EXT, CORE_PATH . 'Behavior'.EXT, ), // 行為擴展定義 'tags' => array( 'view_parse' => array( 'Behavior\ParseTemplate', // 模板解析 支持PHP、內置模板引擎和第三方模板引擎 ), 'template_filter'=> array( 'Behavior\ContentReplace', // 模板輸出替換 ), ), ); ~~~ 我們在ThinkPHP/Mode/Lite目錄下面創建`functions.php`函數庫文件,以及`App.class.php`、`Dispatcher.class.php`、`Controller.class.php`和`View.class.php`,這些類都是針對我們新的應用模式定制的核心類,但是和標準模式的命名空間是一致的,也就是說都在Think命名空間下面。 > ThinkPHP/Mode/Lite目錄用于存放該應用模式下面的所有自定義文件。 應用模式定義文件定義好后,我們就可以在應用中使用該模式了,例如: ~~~ define('MODE_NAME','lite'); define('APP_PATH','./Application/'); require './ThinkPHP/ThinkPHP.php'; ~~~ ## 隱含應用模式 隱含應用模式的模式定義文件位于應用的配置目錄下面 `Application/Common/Conf/core.php`,模式定義文件和顯式應用模式的定義文件一樣。 使用隱含應用模式的時候,不需要在入口文件中定義MODE_NAME,或者說存在隱含應用模式定義文件的時候,MODE_NAME定義無效。 > 注意:如果應用中定義的應用模式需要使用其他的存儲類型,需要在入口文件中定義。 ~~~ define('STORAGE_TYPE','Bae'); ~~~ # 對擴展 老楊的看法 擴展的目的是什么?最大化的做到代碼重用和行為可控制的一種架構方式。 最簡單的道理,當某個一個邏輯代碼寫的次數多了。我們一般就會把他封裝成函數。比如判斷是否登錄函數 其實就是看某個session值存不存在。 封裝成函數的好處是什么。重用以后,如果有修改,只需要改定義的部分。使用的部分不需改變。 而對于某些邏輯光封裝成函數是不夠的。因為里面涉及很多數據(內部+外部+臨時)。 這時候我們就要利用到面向對象的優勢。 將一件事分析清楚,剝離開來,因此有了驅動。 比如上傳驅動。上傳驅動定義了上傳相關的流程。提供了常用的接口方法。然后不同驅動里定義了相應的處理。比如SAE上傳或FTP上傳。抽象類只關心流程,而對應的具體實現,交給驅動去做,你給我統一的返回結果就好了。 當然也不是什么都要復用,有時候也需要隔離。所以才存在公共模塊和其他模塊的區別。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看