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

首頁 > 開發(fā) > PHP > 正文

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

2024-05-04 23:43:45
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Zend Framework教程之Loader以及PluginLoader用法,結(jié)合實(shí)例形式詳細(xì)分析了Zend Framework自動(dòng)加載機(jī)制的原理,使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
 

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

Zend Framework提供了Zend_Loader,用來動(dòng)態(tài)加載文件。

以下是具體用法,以及具體實(shí)現(xiàn):

1.加載文件

使用方法:

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

具體實(shí)現(xiàn):

/** * 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;}

參數(shù)規(guī)則:

正如實(shí)現(xiàn)方法,有如下參數(shù)

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

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

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

2.加載類

具體使用:

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

具體實(shí)現(xiàn):

/*** 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 類名將會(huì)根據(jù)下劃線(作為目錄分隔線)對(duì)應(yīng)到相應(yīng)目錄下的PHP文件,并加上'.php',比如Container_Tree會(huì)指向Container//Tree.php。
$dir     可以是數(shù)組或者字符串。目錄是除去類名包含的目錄的路徑。

3.判斷某個(gè)文件是否可讀

具體使用:

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

具體實(shí)現(xiàn):

/** * 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;}

具體參數(shù):

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

4.Autoloader

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

5.插件加載器

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

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

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

基本用例

首先,假定下面的目錄結(jié)構(gòu)和類文件,并且根(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

現(xiàn)在,創(chuàng)建一個(gè)插件加載器來使各種各樣的視圖助手倉庫可用:

<?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');?>

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

<?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'?>

類加載后,就可以實(shí)例化了。

Note: 為一個(gè)前綴注冊(cè)多個(gè)路徑

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

Note: 實(shí)例化時(shí)定義路徑

你可以提供給構(gòu)造器一個(gè)可選的“前綴/路徑”對(duì)(或“前綴/多個(gè)路徑”)數(shù)組參數(shù):

<?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 在不需要使用單態(tài)實(shí)例的情況下,也可選地允許共享插件,這是通過靜態(tài)注冊(cè)表來完成的,在實(shí)例化時(shí)需要注冊(cè)表名作為構(gòu)造器的第二個(gè)參數(shù):

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

其它使用同名注冊(cè)表來實(shí)例化 PluginLoader 的組件將可以訪問已經(jīng)加載的路徑和插件。

處理插件路徑

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

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

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

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

有時(shí)候你想確定在執(zhí)行一個(gè)動(dòng)作之前是否插件類已經(jīng)加載,isLoaded() 返回插件名的狀態(tài)。

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

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

具體插件加載器的實(shí)現(xiàn)可以參考Zend_Loader_PluginLoader和Zend_Loader。這里不在累述。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
美女扒开尿口让男人操| 久久久久久蜜桃一区二区| 66av99| 国产精品区一区二区三区| 国产亚洲一区二区三区啪| av资源种子在线观看| 精品国产免费无码久久久| 成人免费在线视频网站| 欧美日韩一区在线观看| 久久久视频6r| 久热免费在线观看| 久久人人97超碰人人澡爱香蕉| 久久久久亚洲av无码专区首jn| 国产精品国产a级| 青青国产91久久久久久| 中文国产成人精品| 亚洲日本激情| 人妻无码一区二区三区四区| 欧美精品福利在线| 亚洲第一会所| www视频在线播放| 黑人操亚洲女人| 中文日韩欧美| 夜夜躁狠狠躁日日躁婷婷小说| 国产精品综合一区二区三区| 国产精品无码免费专区午夜| 99久久婷婷国产综合精品| 中文字幕在线精品| 欧美成人精品一区二区三区在线看| 欧美中文字幕久久| 六九午夜精品视频| 久久噜噜噜精品国产亚洲综合| 欧美性猛交xxxx乱大交极品| 日本美女高清在线观看免费| 亚洲一二三四五六区| 欧美精品一区二区三区中文字幕| 久久久一区二区三区四区| 色偷偷网站视频| 二区三区在线视频| 最新国产在线拍揄自揄视频| 超碰色偷偷男人的天堂| 四虎影成人精品a片| 欧州一区二区| 久久久www成人免费毛片麻豆| 成人欧美一区二区三区视频xxx| 成人不卡视频| 看欧美日韩国产| 国产真实乱人偷精品| 一级特黄大欧美久久久| 亚洲精品伦理| 中文字幕va一区二区三区| 中文字幕在线视频观看| 亚洲欧美一区二区三区在线播放| 国产69视频在线观看| www.夜夜操.com| 一区二区三区播放| 永久看片925tv| 精品国产sm最大网站| 国产精品激情偷乱一区二区∴| 色天使在线视频| 亚洲综合激情另类专区老铁性| 欧美又黄又嫩大片a级| 天天色天天射天天综合网| 伊人av在线| 欧美亚洲日本一区二区三区| 精品黑人一区二区三区| 在线观看视频你懂得| 五月开心六月丁香综合色啪| 四虎永久在线观看| 国产理论在线观看| 欧洲美熟女乱又伦| 久久无码av三级| 日本一区二区成人在线| 亚洲免费视频观看| 69堂精品视频| 国产一区二区三区四区五区传媒| 欧美日韩在线观看视频小说| 一级aaaa毛片| 国产精品一区二区女厕厕| 欧美办公室脚交xxxx| 狠狠色丁香婷婷综合| 成人午夜电影免费在线观看| 久热久精久品这里在线观看| 亚洲人妻一区二区| 操欧美女人视频| 97在线播放免费观看| 国产福利久久| 青青草激情视频| 亚洲国产一区二区精品专区| 日本a级片免费| 日韩三级视频在线看| 在线成人直播| 色偷偷综合社区| 在线电影国产精品| 男女爱爱网站| 亚洲视频一区二区三区四区| 91精品久久久久久久久久久久久| 91精品国产福利| 国内自拍欧美| 777精品伊人久久久久大香线蕉| 狠狠色综合日日| 柠檬在线导航福利| 在线观看免费成人| 中文字幕色站| 亚洲电影免费观看高清| 国产精品亚洲电影久久成人影院| 一区二区亚洲视频| 91精品国产综合久久久蜜臀图片| 日本高清久久| 午夜视频www| 天堂av在线中文| 9a蜜桃久久久久久免费| 国产亚洲精品成人| 国产精品一区二区三区美女| 亚洲高清999| 一区二区免费在线视频| 亚洲成人激情在线观看| 亚洲av成人精品一区二区三区在线播放| 性欧美精品一区二区三区在线播放| 天天夜夜人人| 日韩欧美一二三| 九九热精品国产| 精品国产91九色蝌蚪| 夜夜爽夜夜操| 欧美日韩一区二区三区四区五区六区| 色狠狠av一区二区三区香蕉蜜桃| 鲁啊鲁视频在线精品| 男人日女人下面视频| 久久99蜜桃精品| 欧美午夜不卡影院在线观看完整版免费| 亚洲精品免费一区二区三区| 精品剧情v国产在线观看在线| 国产精品草莓在线免费观看| 99这里有精品视频| 一道精品一区二区三区| 激情久久久久久久久久久久久久久久| 欧美亚洲国产另类| 国产精品一区二区精品| 精品美女一区二区三区| 欧美疯狂party性派对| 欧洲grand老妇人| 一本到12不卡视频在线dvd| 精品日韩在线视频| 成人妇女淫片aaaa视频| 亚洲欧洲日韩一区二区三区| 先锋成人影音| 欧美黄色一级网站| 影音先锋男人每日资源站| 国产精品a成v人在线播放| 国产精品18久久久久久久久| 免费中文字幕| 免费在线观看成年人视频| 亚洲激情二区| 岛国毛片在线观看| 丁香五月网久久综合| 韩国日本在线视频| 巨乳女教师的诱惑| 男人和女人做事情在线视频网站免费观看| 亚洲黄色免费观看| 一本色道久久综合亚洲精品小说| 欧美性猛交xxx高清大费中文| 影音先锋制服丝袜| 日本久久久久久久久| 在线观看a视频| 色视频在线观看免费| 国产又大又黑又粗免费视频| 欧美成人一区二区在线| 一区二区三区视频在线播放| 国产午夜在线一区二区三区| 爽好久久久欧美精品| 一区二区三区福利视频| 狠狠操一区二区三区| 亚洲精品中文字幕乱码无线| 外国成人毛片| 免费无码av片在线观看| 亚洲卡通动漫在线| 精精国产xxxx视频在线播放| 狠狠综合久久av| 狠狠色噜噜狠狠狠狠97| 久久久这里只有精品视频| 日韩激情av| 日韩激情在线| 国产精品一区久久久久| 嫩草国产精品入口| 成年人在线观看| 福利在线导航136| 国产日产精品_国产精品毛片| 欧美国产日产图区| 一区二区在线高清视频| 成人a视频在线观看| 综合网在线视频| 欧美性受xxxx狂喷水| 日本欧美视频| 91国模少妇一区二区三区| 91午夜在线观看| 精品视频久久久久久久| 风间由美性色一区二区三区| 日日夜夜一区二区| 黄色一级片免费在线观看| 日本欧美不卡| 亚洲国产97在线精品一区| 日韩在线免费看| 国产亚洲一本大道中文在线| 日韩精品永久网址| 免费日本一区二区三区视频| 欧美性生交xxxxx久久久| 国产精品女主播一区二区三区| 波多野结衣久草一区| 天天干天天做天天操| www.污污视频| 成人av片在线观看| 欧美性猛交99久久久久99| 麻豆入口视频在线观看| 成人性视频免费网站| 国产老妇伦国产熟女老妇视频| 在线视频一二区| 国产伦精品一区二区三区视频青涩| 全球中文成人在线| 精品国产午夜福利在线观看| 亚洲视频在线观看一区二区| 亚洲欧美激情四射在线日| 日韩精品在线视频免费观看| 亚洲人成在线一二| 中文字幕在线观看免费高清| 日韩一区二区三区精品视频| 中文字幕有码av| 国产午夜精品无码| 国产调教打屁股xxxx网站| 成人精品视频在线播放| 欧美一区二区三区艳史| 国产精品久久久久久久久毛片| 日韩成人av免费| 久草精品在线观看| 日韩免费毛片视频| 情趣网站在线观看| xxxx69·hdxxxxx| 九九精品视频在线看| 国产卡1卡2卡三卡在线| 国产乱人伦偷精品视频免下载| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 国产成人鲁鲁免费视频a| 欧美日韩免费高清一区色橹橹| 久久中文娱乐网| 久久av影视| 深夜福利视频一区| www.欧美国产| 久艹在线观看视频| 色综合免费视频| 久久久久国产一区二区三区四区| 免费一级suv好看的国产网站| 91久久久久久久久久久久| 一级黄色片在线观看| 国产精品免费不| 色欧美片视频在线观看在线视频| 亚洲在线视频| 国产一区二区三区在线播放免费观看| 免费一级片网址| 91婷婷韩国欧美一区二区| 久久精品国产一区二区三区肥胖| 一区二区日韩| 亚洲福利在线观看视频| 免费一级做a爰片久久毛片潮| 亚洲av成人精品毛片| 成人av免费观看| 国产精品合集一区二区| 精品孕妇一区二区三区| 狠狠爱成人网| 国产福利资源一区| 黄色91av| 男男做爰猛烈叫床爽爽小说| 一区二区高清视频在线观看| 天天噜噜噜噜噜噜| 羞羞视频在线观看一区二区| 超碰人人草人人| 成人区精品一区二区不卡| 亚洲综合欧美色图| 五月婷婷中文字幕| 国产精品欧美在线观看| 无码人妻aⅴ一区二区三区有奶水| 欧美精品一区二区三区久久久| 又黄又爽的视频在线观看| 亚洲成人资源| 国产精品美女久久久久av福利| 亚洲欧洲第一视频| 成人免费在线观看av| 性欧美videos精品| 成人性生交大片免费看在线播放| 91丨porny丨九色| 91精选在线| 日韩视频免费在线播放| 女人被男人躁得好爽免费视频| 国产视频www| 黄www在线观看| 在线日韩电影| 欧美日韩中文在线| 亚洲成人免费视| 91偷拍与自偷拍精品| 欧美电影网址| 无码内射中文字幕岛国片| 一级美女在线| 91美女精品福利| 精品视频在线观看一区二区| 中文字幕日本视频| 男人操女人下面视频| 成人区精品一区二区不卡| 国产精品免费久久| 91av看片| 蜜桃在线视频| 亚洲精品在线电影| 亚洲精品**中文毛片| 色先锋资源在线播放av| av在线免费播放网站| 国模无码大尺度一区二区三区| 国产区在线观看成人精品| 久久久青草婷婷精品综合日韩| 国产三级理论片| 亚洲精品综合在线观看| 丝袜亚洲另类欧美综合| 国产成人精品免费久久久久| 久久免费精品国产| 洋洋av久久久久久久一区| 大地资源中文在线观看免费版| 国产成a人无v码亚洲福利| 一区二区国产精品视频| 91精品啪在线观看国产| 青青青草网站免费视频在线观看| 成人免费视频视频在线观看免费| 久久亚洲一区二区|