Zend_loader 文档翻译

来源:互联网 发布:数模动态最优化 编辑:程序博客网 时间:2024/05/17 01:38

Zend_loader

动态的读取文件和类

Zend_Loader类包含了许多方法去帮助你动态的读取文件
Tip

Zend_Loader vs. require_once()

Zend_Loader在你需要读取的文件名是变量时非常好用。例如,它是基于user input或者method argument。如果你读取的文件或类的名字是常量的话,那么Zend_Loader相比传统的PHP functions就没什么好处,如require_once()。

读取文件(Loading Files)

static方法Zend_Loader::loadFile()读取一个PHP文件。读取的文件可能包含任何PHP代码。这个方法是用PHP的include()封装的,在失败的时候会发出PHP warning(例如文件不存在的时候)。
Example #1 Example of the loadFile() Method

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

filenamefilename上执行了一个安全检查。filename线.dirs参数上。
$dirs参数指定了要search文件的文件夹。如果设为NULL,只有include_path会被search;如果值是string或array类型的话,对应的文件夹就会遵循include_path去search。
$once参数是boolean类型。如果是TRUEZend_Loader::loadFile()就会使用PHP函数include_once()来读取文件,否则就会使用PHP函数include()

读取类(Loading Classes)

static方法Zend_Loader::loadClass(class,dirs)读取一个PHP文件然后检查类的存在。
Example #2 Example of the loadClass() Method

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

这string通过替换下划线转换为相对路径的你的操作系统下的目录分隔符来指定class,并跟上‘.php’。在上面的例子中,‘Container_Tree’在Windows下变为’Container\Tree.php’。
如果dirstringarrayZendLoader::loadFile()ordersearchdir中,那么PHP环境中的include_path会被search。
如果文件没被找到或者class在加载后不存在,Zend_Loader::loadFile()**throw a **Zend_Exception
Zend_Loader::loadFile()是用来读取的,因此class name可能只包含字母数字字符和横岗“-”,下划线“_”,和点“.”。

Note:Loading Classes from PHP Namespaces
从1.10.0开始,Zend框架允许从PHP namespaces中读取class。这项支持遵循着和 PHP Framework Interop Group PSR-0相同的guidelines和implementation.
在这个guideline之下,以下的规则适用:
- 每个namespace separator会在读取文件系统的时候转换成一个DIRECTORY_SEPARATOR
- CLASS NAME中的每个“_”字符会被转换为DIRECTORY_SEPARATOR
“_”字符在namespace中没有特殊含义
- 完全合格的namespace会在从文件系统读取的时候添加“.php”后缀。
例如:
- \Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
- \namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
- \namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php

可读文件的测试(Testing if a File is Readable)


使用Autoloader

Zend_Loader类包含一个可以用PHP SPL autoloader来注册的方法
Zend_Loader::autoload()是一个回调方法。为了方便,Zend_Loader提供registerAutoload() function来注册autoload()方法。如果spl_autoload扩展在你的PHP环境中不存在,那么registerAutoload() method throw a Zend_Exceptioin
Example #4 Example of registering the autoloader callback method

Zend_Loader::registerAutoload();

在Zend框架回调注册之后,你可以从Zend框架里引用类而不需要声明引用。autoload()方法会在你引用类的时候自动使用Zend_Loader::loadClass()
如果你想扩展Zend_Loader类,你可以给registerAutoload()传参数,去指定从autoload()注册哪个类。
Example #5 Example of registering the autoload callback method from an extended class
因为PHP静态方法引用的语义问题,你必须把loadClass()autoload()都实现,同事autoload()必须调用self::loadClass(),然后它将会在父类里调用,而不是子类

class My_Loader extends Zend_Loader{    public static function loadClass($class, $dirs = null)    {        parent::loadClass($class, $dirs);    }    public static function autoload($class)    {        try {            self::loadClass($class);            return $class;        } catch (Exception $e) {            return false;        }    }}Zend_Loader::registerAutoload('My_Loader');

你可以删除一个autoload回调。registerAutoload()第二个参数默认为TRUE,如果是FALSE,autoload回调会从SPL autoload stack中注销掉。

原创粉丝点击