亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

Zend Framework教程之Loader以及PluginLoader用法詳解

2024-05-04 23:43:45
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Zend Framework教程之Loader以及PluginLoader用法,結合實例形式詳細分析了Zend Framework自動加載機制的原理,使用方法與相關注意事項,需要的朋友可以參考下
 

本文實例分析了Zend Framework中Loader以及PluginLoader用法。分享給大家供大家參考,具體如下:

Zend Framework提供了Zend_Loader,用來動態加載文件。

以下是具體用法,以及具體實現:

1.加載文件

使用方法:

Zend_Loader::loadFile($filename, $dirs=null, $once=false);

具體實現:

/** * Loads a PHP file. This is a wrapper for PHP's include() function. * * $filename must be the complete filename, including any * extension such as ".php". Note that a security check is performed that * does not permit extended characters in the filename. This method is * intended for loading Zend Framework files. * * If $dirs is a string or an array, it will search the directories * in the order supplied, and attempt to load the first matching file. * * If the file was not found in the $dirs, or if no $dirs were specified, * it will attempt to load it from PHP's include_path. * * If $once is TRUE, it will use include_once() instead of include(). * * @param string    $filename * @param string|array $dirs - OPTIONAL either a path or array of paths *            to search. * @param boolean    $once * @return boolean * @throws Zend_Exception */public static function loadFile($filename, $dirs = null, $once = false){  self::_securityCheck($filename);  /**   * Search in provided directories, as well as include_path   */  $incPath = false;  if (!empty($dirs) && (is_array($dirs) || is_string($dirs))) {    if (is_array($dirs)) {      $dirs = implode(PATH_SEPARATOR, $dirs);    }    $incPath = get_include_path();    set_include_path($dirs . PATH_SEPARATOR . $incPath);  }  /**   * Try finding for the plain filename in the include_path.   */  if ($once) {    include_once $filename;  } else {    include $filename;  }  /**   * If searching in directories, reset include_path   */  if ($incPath) {    set_include_path($incPath);  }  return true;}

參數規則:

正如實現方法,有如下參數

$filename參數指定需要加載的文件,注意$filename不需要指定任何路徑,只需要文件名即可。ZF會對文件作安全性檢查。$filename 只能由字母,數字,連接符-,下劃線_及英文句號.組成(半角)。$dirs參數則不限,可以使用中文等。

$dirs 參數用來指定文件所在目錄,可以是一個字符串或者數組。如果為 NULL,則程序將會到系統的 include_path 下尋找文件是否存在(include_path可在php.ini中設置--Haohappy注),如果是字符串或數組,則會到指定的目錄下去找,然后才是 include_path。

$once 參數為布爾類型,如果為 TRUE,Zend_Loader::loadFile() 使用 PHP 函數 » include_once() 加載文件,否則就是 PHP 函數 » include()。(本參數只能是true或false,兩者區別就和include()和include_once()的區別一樣。)

2.加載類

具體使用:

Zend_Loader::loadClass('Container_Tree',  array(    '/home/production/mylib',    '/home/production/myapp'  ));

具體實現:

/*** Loads a class from a PHP file. The filename must be formatted* as "$class.php".** If $dirs is a string or an array, it will search the directories* in the order supplied, and attempt to load the first matching file.** If $dirs is null, it will split the class name at underscores to* generate a path hierarchy (e.g., "Zend_Example_Class" will map* to "Zend/Example/Class.php").** If the file was not found in the $dirs, or if no $dirs were specified,* it will attempt to load it from PHP's include_path.** @param string $class   - The full class name of a Zend component.* @param string|array $dirs - OPTIONAL Either a path or an array of paths*               to search.* @return void* @throws Zend_Exception*/public static function loadClass($class, $dirs = null){    if (class_exists($class, false) || interface_exists($class, false)) {      return;    }    if ((null !== $dirs) && !is_string($dirs) && !is_array($dirs)) {      require_once 'Zend/Exception.php';      throw new Zend_Exception('Directory argument must be a string or an array');    }    // Autodiscover the path from the class name    // Implementation is PHP namespace-aware, and based on    // Framework Interop Group reference implementation:    // http://groups.google.com/group/php-standards/web/psr-0-final-proposal    $className = ltrim($class, '//');    $file   = '';    $namespace = '';    if ($lastNsPos = strripos($className, '//')) {      $namespace = substr($className, 0, $lastNsPos);      $className = substr($className, $lastNsPos + 1);      $file   = str_replace('//', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;    }    $file .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';    if (!empty($dirs)) {      // use the autodiscovered path      $dirPath = dirname($file);      if (is_string($dirs)) {        $dirs = explode(PATH_SEPARATOR, $dirs);      }      foreach ($dirs as $key => $dir) {        if ($dir == '.') {          $dirs[$key] = $dirPath;        } else {          $dir = rtrim($dir, '///');          $dirs[$key] = $dir . DIRECTORY_SEPARATOR . $dirPath;        }      }      $file = basename($file);      self::loadFile($file, $dirs, true);    } else {      self::loadFile($file, null, true);    }    if (!class_exists($class, false) && !interface_exists($class, false)) {      require_once 'Zend/Exception.php';      throw new Zend_Exception("File /"$file/" does not exist or class /"$class/" was not found in the file");    }}

$class 類名將會根據下劃線(作為目錄分隔線)對應到相應目錄下的PHP文件,并加上'.php',比如Container_Tree會指向Container//Tree.php。
$dir     可以是數組或者字符串。目錄是除去類名包含的目錄的路徑。

3.判斷某個文件是否可讀

具體使用:

if (Zend_Loader::isReadable($filename)) {  // do something with $filename}

具體實現:

/** * Returns TRUE if the $filename is readable, or FALSE otherwise. * This function uses the PHP include_path, where PHP's is_readable() * does not. * * Note from ZF-2900: * If you use custom error handler, please check whether return value * from error_reporting() is zero or not. * At mark of fopen() can not suppress warning if the handler is used. * * @param string  $filename * @return boolean */public static function isReadable($filename){  if (is_readable($filename)) {    // Return early if the filename is readable without needing the    // include_path    return true;  }  if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'    && preg_match('/^[a-z]:/i', $filename)  ) {    // If on windows, and path provided is clearly an absolute path,    // return false immediately    return false;  }  foreach (self::explodeIncludePath() as $path) {    if ($path == '.') {      if (is_readable($filename)) {        return true;      }      continue;    }    $file = $path . '/' . $filename;    if (is_readable($file)) {      return true;    }  }  return false;}

具體參數:

$filename參數指定了要檢查的文件名,包括路徑信息。這個方法是將 PHP 函數» is_readable()封裝而成的,is_readable() 不會自動查找 include_path 下的文件,而 Zend::isReadable() 可以。

4.Autoloader

這個類的Autoloader功能已經不推薦使用了,所以不再講述。還有其他的Autoloader,以后具體說明。

5.插件加載器

幫助文章給出的具體實例如下,可參考使用:

很多 Zend Framework 組件支持插件,允許通過指定類的前綴和到類的文件(不需要在 include_path或不需要遵循傳統命名約定的文件)的路徑動態加載函數。Zend_Loader_PluginLoader 提供了普通的函數來完成這個工作。

PluginLoader 的基本用法遵循 Zend Framework 的命名約定(一個文件一個類),解析路徑時,使用下劃線作為路徑分隔符。當決定是否加載特別的插件類,允許傳遞可選的類前綴來預處理。另外,路徑按 LIFO 順序來搜索。由于 LIFO 搜索和類的前綴,允許命名空間給插件,這樣可以從早期注冊的路徑來覆蓋插件。

基本用例

首先,假定下面的目錄結構和類文件,并且根(toplevel)目錄和庫目錄在 include_path 中:

application/
    modules/
        foo/
            views/
                helpers/
                    FormLabel.php
                    FormSubmit.php
        bar/
            views/
                helpers/
                    FormSubmit.php
library/
    Zend/
        View/
            Helper/
                FormLabel.php
                FormSubmit.php
                FormText.php

現在,創建一個插件加載器來使各種各樣的視圖助手倉庫可用:

<?php$loader = new Zend_Loader_PluginLoader();$loader->addPrefixPath('Zend_View_Helper', 'Zend/View/Helper/')    ->addPrefixPath('Foo_View_Helper', 'application/modules/foo/views/helpers')    ->addPrefixPath('Bar_View_Helper', 'application/modules/bar/views/helpers');?>

接著用類名中添加路徑時定義的前綴后面的部分來加載一個給定的視圖助手:

<?php// load 'FormText' helper:$formTextClass = $loader->load('FormText'); // 'Zend_View_Helper_FormText';// load 'FormLabel' helper:$formLabelClass = $loader->load('FormLabel'); // 'Foo_View_Helper_FormLabel'// load 'FormSubmit' helper:$formSubmitClass = $loader->load('FormSubmit'); // 'Bar_View_Helper_FormSubmit'?>

類加載后,就可以實例化了。

Note: 為一個前綴注冊多個路徑

有時候,多個路徑使用相同的前綴,Zend_Loader_PluginLoader 實際上為每個給定的前綴注冊一個路徑數組;最后注冊的被首先檢查,當你使用孵化器里的組件時,這相當有用。

Note: 實例化時定義路徑

你可以提供給構造器一個可選的“前綴/路徑”對(或“前綴/多個路徑”)數組參數:

<?php$loader = new Zend_Loader_PluginLoader(array(  'Zend_View_Helper' => 'Zend/View/Helper/',  'Foo_View_Helper' => 'application/modules/foo/views/helpers',  'Bar_View_Helper' => 'application/modules/bar/views/helpers'));?>

Zend_Loader_PluginLoader 在不需要使用單態實例的情況下,也可選地允許共享插件,這是通過靜態注冊表來完成的,在實例化時需要注冊表名作為構造器的第二個參數:

<?php// Store plugins in static registry 'foobar':$loader = new Zend_Loader_PluginLoader(array(), 'foobar');?>

其它使用同名注冊表來實例化 PluginLoader 的組件將可以訪問已經加載的路徑和插件。

處理插件路徑

上節的例子示例如何給插件加載器添加路徑,那么如何確定已經加載的路徑或刪除他們呢?

如果沒有提供 $prefix,getPaths($prefix = null) 以“前綴/路徑”對返回所有的路徑;或者如果提供了 $prefix,getPaths($prefix = null) 返回為給定的前綴注冊的路徑。

clearPaths($prefix = null) 將缺省地清除所有的已注冊路徑,或者如果提供了 $prefix 并放在堆棧里,只清除和那些和給定前綴關聯的路徑。

removePrefixPath($prefix, $path = null) 允許有選擇地清除和給定前綴相關的特定的路徑。如果沒有提供 $path ,所有的和前綴相關的路徑被清除,如果提供了 $path 并且相應的前綴存在,只有這個相關的路徑被清除。
測試插件和獲取類的名字

有時候你想確定在執行一個動作之前是否插件類已經加載,isLoaded() 返回插件名的狀態。

PluginLoader 的另一個普通用例是確定已加載類的完全合格的插件類名,getClassName() 提供該功能。一般地,這個和 isLoaded() 聯合使用:

<?phpif ($loader->isLoaded('Adapter')) {  $class  = $loader->getClassName('Adapter');  $adapter = call_user_func(array($class, 'getInstance'));}?>

具體插件加載器的實現可以參考Zend_Loader_PluginLoader和Zend_Loader。這里不在累述。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产高清久久久久久| 国产精品亚洲аv天堂网| 久久亚洲欧美日韩精品专区| 91精品久久久久久久久久久久久| 欧美另类69精品久久久久9999| 欧美一级高清免费播放| 国产伊人精品在线| 91久久久久久久久久| 亚洲欧美三级伦理| 国产成人91久久精品| 国产在线98福利播放视频| 欧美一级在线播放| 亚洲欧美一区二区三区在线| 91久久嫩草影院一区二区| 国产一区av在线| 狠狠久久五月精品中文字幕| 国产精品igao视频| 亚洲男人的天堂在线播放| 欧美国产日韩中文字幕在线| 热久久免费视频精品| 日韩精品在线私人| 这里只有精品久久| 欧美老妇交乱视频| 亚洲免费人成在线视频观看| 亚洲欧洲在线播放| 欧美疯狂性受xxxxx另类| 欧美成人精品在线视频| 97在线免费观看| 精品免费在线观看| 红桃av永久久久| 在线观看中文字幕亚洲| 久久国产精彩视频| 成人激情视频在线| 成人a级免费视频| 91久久久精品| 国产视频久久久久久久| 九九热精品视频国产| 激情亚洲一区二区三区四区| 亚洲精品中文字| 精品国偷自产在线视频99| 亚洲欧美在线第一页| 国产精品一区二区三区免费视频| 亚洲精品久久7777777| 日本sm极度另类视频| 国产精品永久免费观看| 亚洲国产精品电影在线观看| 欧美大学生性色视频| 日韩欧美精品中文字幕| 欧美性猛交xxxx黑人猛交| 久久久久久亚洲精品中文字幕| 国产成人综合精品在线| 亚洲第一二三四五区| 日韩精品视频三区| 国产综合在线观看视频| 色综合久久久久久中文网| 欧美在线观看www| 亚洲xxx视频| 亚洲天堂开心观看| 欧美大荫蒂xxx| 成人有码在线播放| 国产精品亚洲自拍| 高清欧美性猛交xxxx黑人猛交| 久久精品一偷一偷国产| 欧美激情精品久久久久久免费印度| 欧美黄色片在线观看| 亚洲偷欧美偷国内偷| xxxx欧美18另类的高清| 国产欧美精品xxxx另类| 性亚洲最疯狂xxxx高清| 亚洲aa中文字幕| 欧美高清videos高潮hd| 亚洲欧美日韩一区二区三区在线| 全亚洲最色的网站在线观看| 国产精品电影久久久久电影网| 搡老女人一区二区三区视频tv| 国内成人精品一区| 国产欧美精品在线| 日韩视频在线观看免费| 久久精品免费电影| 91在线观看免费观看| 国产亚洲视频在线| 日韩精品欧美激情| 欧美日韩xxxxx| 97av在线视频| 亚洲男人天堂久| 欧美另类精品xxxx孕妇| 日韩在线视频一区| 精品久久久久久中文字幕一区奶水| 欧美大胆a视频| 日韩精品免费在线观看| 国产精品18久久久久久首页狼| 亚洲天堂av在线播放| 国产日韩欧美在线| 91沈先生作品| 精品亚洲一区二区| 日本成人在线视频网址| 久久精品99久久久香蕉| 亚洲乱亚洲乱妇无码| 欧美日韩国产区| 国产精品h片在线播放| 久久精品久久久久| 91sao在线观看国产| 成人乱色短篇合集| 2019最新中文字幕| 亚洲精品国产精品自产a区红杏吧| 疯狂蹂躏欧美一区二区精品| 亚洲成人精品久久| 日韩精品在线播放| 欧美亚洲视频在线看网址| 成人在线视频网站| 最近2019中文字幕mv免费看| 国产一区二区成人| 日韩激情片免费| 亚洲自拍欧美色图| 中文字幕日韩在线播放| 亚洲激情在线观看视频免费| 亚洲国产精品va在线观看黑人| 久久免费国产精品1| 久精品免费视频| 久久精品亚洲94久久精品| 国产精品日韩欧美综合| 中文字幕av日韩| 在线播放日韩欧美| 亚洲全黄一级网站| 成人福利免费观看| 亚洲一级黄色片| 555www成人网| 国产精品大陆在线观看| 成人动漫网站在线观看| 亚洲一二在线观看| 7777kkkk成人观看| 亚洲国产精品va在看黑人| 7m第一福利500精品视频| 国产不卡视频在线| 欧美国产日韩一区二区| 亚洲精品视频网上网址在线观看| 中文字幕日韩欧美| 成人亚洲综合色就1024| 欧美在线视频导航| 国产日韩欧美在线播放| 亚洲欧美日韩国产成人| 亚洲美女视频网| 4k岛国日韩精品**专区| 国产日韩精品视频| 久久久久久免费精品| 97视频国产在线| 青青草原一区二区| 中文精品99久久国产香蕉| 国产视频观看一区| 欧美久久精品一级黑人c片| 国产精品一区二区三区成人| 色在人av网站天堂精品| 在线一区二区日韩| 国产精品久久网| 97精品一区二区三区| 国产xxx69麻豆国语对白| 伦伦影院午夜日韩欧美限制| 久久综合国产精品台湾中文娱乐网| 国产精品中文字幕在线观看| 久久国产精品久久国产精品| 国产精品极品在线| 国产欧美一区二区三区久久| 57pao国产精品一区| 亚洲欧美国产精品久久久久久久|