在使用phpexcel类库的时候,发现一个有意思的事情:
看上面的文件结构,只有一个phpexcel.php和一个目录,而我们在使用这个类库的时候,只需要将phpexcel.php文件包含进去就好了。其他的文件装载就不需要理会啦。
例如上面的文章提到的使用方式:require_once('./phpexcel1.7.3/PHPExcel.php');后面使用其他的类库都没有包含。
看了PHPExcel.php的代码后,发现其中的原因:
它首先使用下面这样的一个自动装载代码
/** PHPExcel root directory */
if (!defined('PHPEXCEL_ROOT'))
{
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/');
require(PHPEXCEL_ROOT .'PHPExcel/Autoloader.php');
PHPExcel_Autoloader::Register();
............
}
下面是自动装载的实现代码:只要功能是将Load函数自动装载为spl_autoload();
class PHPExcel_Autoloader
{
public static function Register() {
return spl_autoload_register(array('PHPExcel_Autoloader', 'Load'));
} // function Register()
public static function Load($pObjectName){
if ((class_exists($pObjectName)) || (strpos($pObjectName, 'PHPExcel') === False)) {
return false;
}
$pObjectFilePath = PHPEXCEL_ROOT.
str_replace('_',DIRECTORY_SEPARATOR,$pObjectName).
'.php';
if ((file_exists($pObjectFilePath) === false) || (is_readable($pObjectFilePath) === false)) {
return false;
}
require($pObjectFilePath);
} // function Load()
}
当php执行代码的时候发现没有引用相关的文件就会执行Load的静态函数,这样在Load里面实现函数的装载显得简单,方便。
举个例子:我们在使用PHPExcel读写类的时候,代码如下:
reader_obj = new PHPExcel_Reader_Excel2007();
excel2007在文件中的目录结构如下:
这样他就调用了
PHPEXCEL_ROOT. str_replace('_',DIRECTORY_SEPARATOR,$pObjectName). '.php';
将其变为文件的目录结构,并将文件包含。
我们在编写php程序时,通常将一些功能包装成类的方式,由于在实现某一写功能的时候,可能要加载大量的相关类库,通过使用这样一种自动装载函数,
大大减少加载库文件的混乱。
当然我们也可以自己定义一套操作库文件的函数:这里提供一个简单的例子:
//约定$class的格式使用点来标记文件夹目录
//例如:文件/modules/example.class.php import("modules.example")
function import($class)
{
$path = ROOT . strtr($class, '.', '/') . ".class.php";
if(is_file($path))
{
include_once($path);
}
else
{
exit("$file is not found in " );
}
}