SPL autoload 初体验
昨天终于把项目的东西赶了出来,有点累,但是满有成就感,哈…… Drupal 看了两周,算是对 HOOK 部分有了个大概了解,不得不感慨下老外的设计思想确实很值得我们去学习,为啥国人就做不出一个像样点的 CMS 来呢?!或者准确点来说 Drupal 压根不能归类于 CMS 吧,很建议大家去研究下,前段时间我就吐血推荐给标老大去玩玩,算是对开源界做点贡献,哈哈 :)
今日看了下 PHP 的东西,以前一直没有时间研究 OPCODE 的东东,只需要安装 VLD (http://pecl.php.net/package/vld),大家可以找来玩玩。
现在来讲讲关于 Standard PHP Library (SPL) 的 autoload 的方法,这些都是 PHP 5.1.2 之后才加上的方法,大家可能都用过 __autoload 来写自己的 autoload 功能,为什么还需要用 spl_autoload 呢,至少 Zend Framework 都是使用 spl_autoload,我想肯定有他们的道理吧。Google 了一下关于他们的优劣比较,大致是 OO 和灵活性这两方面。关于 OO,我是不敢苟同,只能说 __autoload 是一个全局魔法函数,而 spl_autoload_register 可以放在任何地方注册的概念,跟 OO 没啥多大的关系吧;而灵活性方面,我觉得 SPL 的方法是有点优势,可以定义多个 autoloader 是一个,比起写一个冗肿的 __autoload 方法优雅 (在 Drupal 评价里面很多这个形容词) 很多,下面贴一下代码
class autoload
{
public static function load($class)
{
if (is_file('./inc1/' . $class . '.php')) {
require_once './inc1/' . $class . '.php';
}
}
}
function __autoload($class)
{ // 这个是默认的 autoload 方法
if (is_file('./inc2/' . $class . '.php')) {
require_once './inc2/' . $class . '.php';
}
}
// 注册一个 autoloader
spl_autoload_register('autoload::load');
/**
* __autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法
* 可以通过下面的方法来把 _autoload 方法加入 autoload_functions list
*/
spl_autoload_register('__autoload');
// 假设头文件在 ./inc1/foo.php
$foo = new foo();
$foo->bar();
// 假设头文件在 ./inc2/foo1.php
$foo1 = new foo1();
$foo1->bar();