PHP的类自动加载机制
-
手动加载方式
像C和C++等语言,在PHP中需要使用另一个文件中的相关的类、方法时,可以使用include、include_once、require或者require_once将所用的文件包含进工程里面。
- include将套用一个文件,如果文件不存在,则给出一个提示,跳过继续执行;
- include_once也是套用一个文件,但是只会套用一次,如果文件不存在,则继续执行
- require表示套用一个文件,如果文件不存在,则中断程序的执行;
- require_once也是套用一个文件,且只会套用一次,如果文件不存在,则中断程序的执行;
以上四种方式是需要什么文件的时候,手动在程序当中包含进文件。这在项目的规模比较小的时候,是可以的;但是随着项目规模的扩大,要通过手动的方式加载每个文件所需要的类简直是一场噩梦。
-
自动加载方式
为了将双手从类的加载方式中解放出来,在PHP5及以后的版本中提供了一个自动加载的机制---
autoload
。Autoload可以使类在确实被需要的情况下才会被加载进来,也就是所谓的lazy loading
,而不是一开始就include
或者require
所有的类文件。其中PHP提供的自动加载机制又分为两种__autoload()
以及spl_autoload_register()
。- __autoload
在PHP5中运行程序的过程中,如果发现某一个类并没有被包含进来,那么就会运行__autoload自动加载机制,将所需要的类加载进来。其写法如下:
< ? php public function __autoload($classname) { $fileName = $classname."php"; if (file_exist($fileName)) { require_once("$fileName"); } else { echo $fileName." doesn't exist!" } }
这个程序写法,我们可以得到如下的结论:保证自动加载机制的的原则就是要使得类名和文件名具有一种对应关系,类名+后缀构成了这个类所在的文件的名字。如果这个文件确实存在,那么就根据$fileName将该类加载进来。如果文件不存在,则提示用户,文件不存在。总的来说自动加载机制包括三个步骤:
根据类名确定文件名,也就是确定一种类名和文件名之间的统一对应规则;
根据文件名在磁盘上找到相应的对应文件(例子中是最简单的情况,就是类与调用他们的PHP文件都在同一个目录下);如果不在同一个目录下,那么可以使用set_include_path()指定要加载的路径;
-
将磁盘文件加载到文件系统中,这一步只是用一般的include和require包含相应的类文件;
__autoload()实现类的自动加载的原则就是:类名和文件名之间具有一种统一的对应关系,这是在一个系统中实现__autoload的关键所在。但是一个系统可能是有不同的人员所开发,如果在开发之前没有约定统一的标准,则可能存在不同的对应规则,导致需要在__autoload()中实现多种加载规则,那么可能导致__autoload()函数非常的臃肿。为了解决这个这个问题,PHP还提供了一个自动加载机制---spl_autoload_register().
- __autoload
-
spl_autoload_register()
<? php
function autoload1($classname) {
$fileName = $classname.".php";
if (file_exist($fileName)) {
require_once("$fileName");
} else {
echo $fileName." doesn't exist!"
}
}
function autoload2($classname) {
$fileName = $classname.".class.php";
if (file_exist($fileName)) {
require_once("$fileName");
} else {
echo $fileName." doesn't exist!"
}
spl_autoload_register("autoload1");
spl_autoload_register("autoload2");
}
网友评论