谈谈php中自动装载函数__autoload

在使用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();
 PHPExcel_Shared_ZipStreamWrapper::register();
 // check mbstring.func_overload
 if (ini_get('mbstring.func_overload') & 2) {
 throw new Exception('Multibyte function overloading in PHP must be disabled for string functions (2).');
 }
}

/** 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 " );

  }

}

 

posted @ 2010-07-05 10:24  库从志  阅读(1342)  评论(0编辑  收藏  举报