PHP的autoload机制的实现理会

时间:2014-02-15所属栏目: PHP/PHP框架 来源: 未知 热度:

一、autoload机制概述
在行使PHP的OO模式开拓体系时,凡是各人风俗大将每个类的实现都存放在一个单独的文件里,这样会很轻易实现对类举办复用,同时未来维护时也很便利。这也是OO计划的根基头脑之一。在PHP5之前,假如必要行使一个类,只必要直接行使include/require将其包括进来即可。
下面是一个现实的例子:

/* Person.class.php */
<?php
class Person {
  var $name, $age;
  
  function __construct ($name, $age)
  {
   $this->name = $name;
   $this->age = $age;
  }
}
?>
/* no_autoload.php */
<?php
require_once ("Person.class.php");

$person = new Person("Altair", 6);
var_dump ($person);

在这个例子中,no-autoload.php文件必要行使Person类,它行使了require_once将其包括,然后就可以直接行使Person类来实例化一个工具。

但跟着项目局限的不绝扩大,行使这种方法会带来一些隐含的题目:假如一个PHP文件必要行使许多其余类,那么就必要许多的require/include语句,这样有也许会造成漏掉可能包括进不须要的类文件。假如大量的文件都必要行使其余的类,那么要担保每个文件都包括正确的类文件必定是一个恶梦。

PHP5为这个题目提供了一个办理方案,这就是类的自动装载(autoload)机制。autoload机制可以使得PHP措施有也许在行使类时才自动包括类文件,而不是一开始就将全部的类文件include进来,这种机制也称为lazy loading。

下面是行使autoload机制加载Person类的例子:

/* autoload.php */
<?php
function __autoload($classname) {
  require_once ($classname . "class.php");
}

$person = new Person("Altair", 6);
var_dump ($person);
?>

凡是PHP5在行使一个类时,假如发明这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载必要行使的类。在我们这个简朴的例子中,我们直接将类名加上扩展名”.class.php”组成了类文件名,然后行使require_once将其加载。从这个例子中,我们可以看出autoload至少要做三件工作,第一件事是按照类名确定类文件名,第二件事是确定类文件地址的磁盘路径(在我们的例子是最简朴的环境,类与挪用它们的PHP措施文件在统一个文件夹下),第三件事是将类从磁盘文件中加载到体系中。第三步最简朴,只必要行使include/require即可。要实现第一步,第二步的成果,必需在开拓时约定类名与磁盘文件的映射要领,只有这样我们才气按照类名找到它对应的磁盘文件。

因此,当有大量的类文件要包括的时辰,我们只要确定响应的法则,然后在__autoload()函数中,将类名与现实的磁盘文件对应起来,就可以实现lazy loading的结果。从这里我们也可以看出__autoload()函数的实现中最重要的是类名与现实的磁盘文件映射法则的实现。

但此刻题目来了,假如在一个体系的实现中,假如必要行使许多其余的类库,这些类库也许是由差异的开拓职员编写的,其类名与现实的磁盘文件的映射法则不尽沟通。这时假如要实现类库文件的自动加载,就必需在__autoload()函数中将全部的映射法则所有实现,这样的话__autoload()函数有也许会很是伟大,乃至无法实现。最后也许会导致__autoload()函数异常痴肥,这时即便可以或许实现,也会给未来的维护和体系服从带来很大的负面影响。在这种环境下,莫非就没有更简朴清楚的办理步伐了吧?谜底虽然是:NO! 在看进一步的办理要领之前,我们先来看一下PHP中的autoload机制是怎样实现的。

标签:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)