0

0

Zend Framework教程之Loader以及PluginLoader用法详解,zendpluginloader_PHP教程

php中文网

php中文网

发布时间:2016-07-12 08:57:35

|

948人浏览过

|

来源于php中文网

原创

Zend Framework教程之Loader以及PluginLoader用法详解,zendpluginloader

本文实例分析了Zend Framework中Loader以及PluginLoader用法。分享给大家供大家参考,具体如下:

Zend Framework提供了Zend_Loader,用来动态加载文件。

以下是具体用法,以及具体实现:

1.加载文件

立即学习PHP免费学习笔记(深入)”;

使用方法:

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.插件加载器

帮助文章给出的具体实例如下,可参考使用:

Unreal Images
Unreal Images

免费的AI图片库

下载

很多 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() 联合使用:

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

具体插件加载器的实现可以参考Zend_Loader_PluginLoader和Zend_Loader。这里不在累述。

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:

  • Zend Framework教程之配置文件application.ini解析
  • Zend Framework教程之Autoloading用法详解
  • Zend Framework教程之Resource Autoloading用法实例
  • Zend Framework教程之MVC框架的Controller用法分析
  • Zend Framework教程之路由功能Zend_Controller_Router详解
  • Zend Framework教程之Zend_Controller_Plugin插件用法详解
  • Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
  • Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
  • Zend Framework教程之动作的基类Zend_Controller_Action详解
  • Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
  • Zend Framework教程之前端控制器Zend_Controller_Front用法详解
  • Zend Framework教程之Application和Bootstrap用法详解

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1108615.htmlTechArticleZend Framework教程之Loader以及PluginLoader用法详解,zendpluginloader 本文实例分析了Zend Framework中Loader以及PluginLoader用法。分享给大家供大家参考,...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
zend框架2视频教程
zend框架2视频教程

共79课时 | 14.1万人学习

C# 教程
C# 教程

共94课时 | 9.7万人学习

Laravel基础快速入门
Laravel基础快速入门

共15课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号