第 17 章 Zend_Loader

17.1. 动态加载文件和类

Zend_Loader类可以帮助你动态加载文件。

[提示] Zend_Loader vs. require_once()

Zend_Loader最适合于加载的文件名是变量的情况(例如你要加载的文件的名称来自于用户的输入或者某个方法的参数)。如果你加载的文件名或类名是一个常量(即确定的文件,如/lib/test.php),则使用Zend_Loader并不比传统的PHP函数 require_once()有什么优势。

17.1.1. 加载文件

静态方法Zend::loadFile()用来包含PHP文件。它其实是将PHP的include()函数封装而成的一个静态方法。当包含文件失败时,会抛出异常Zend_Exception 。

例 17.1. Example of loadFile() method


<?php

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

?>

$filename参数指定需要加载的文件,注意$filename不需要指定任何路径,只需要文件名即可。ZF会对文件作安全性检查。$filename只能由字母,数字,连接符-,下划线_及英文句号.组成(半角)。$dirs参数则不限,可以使用中文等。

$dirs参数用来指定文件所在目录,可以是一个字符串或者数组。如果为空,则程序将会到系统的include_path下寻找文件是否存在(include_path可在php.ini中设置--Haohappy注)

$once 参数为布尔类型,只能是true或false,两者区别就和include()和include_once()的区别一样。

17.1.2. 加载类

静态方法Zend_Loader::loadClass($class, $dirs)用来加载一个PHP类文件,该文件名格式为“$className.php”(也就是说加载的文件名称必须和文件中的类同名)。loadClass()会检查文件中的类是否存在。

例 17.2. loadClass() 示例:


<?php

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

?>

类名将会根据下划线(作为目录分隔线)对应到相应目录下的PHP文件,比如Container_Tree会指向Container/Tree.php。

如果$dirs是一个字符串或数组, Zend_Loader::loadClass()会根据顺序查找相应目录,并加载第一个匹配的文件。如果文件不存在,则会查找inculde_path指定的目录。

如果文件不存在或者文件中相应的类不存在,那么Zend_Loader::loadClass()就会抛出一个Zend_Exception异常。

类名中只能包含字母,连接符-、下划线_和句点.

17.1.3. 判定某个文件是否可读

静态方法Zend_Loader::isReadable($pathname)判定某个文件是否存在并可读,可读则返回true,否则返回false。

例 17.3. isReadable()示例:


<?php

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

?>

$filename参数指定了要检查的文件名,包括路径信息。这个方法是将PHP函数is_readable()封装而成的,is_readable()不会自动查找include_path下的文件,而Zend::isReadable()可以。