怎么在PHP项目中实现一个自动装载机制

介绍

这期内容当中小编将会给大家带来有关怎么在PHP项目中实现一个自动装载机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>一、自动装载机制概述

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用包括/要求将其包含进来即可。
下面是一个实际的例子:

代码如下:


/* Person.class。php */
& lt; ?php
类人{
var的名字,美元年龄;
函数__construct(姓名,年龄)美元
{
$ this→名称=$名称;年龄
这→美元=$年龄;
}
}
?比;
/* no_autoload。php */
& lt; ?php
require_once (“Person.class.php");
$人=新人(“Altair" 6);
var_dump(人);



在这个例子中,no-autoload。php文件需要使用类,它使用了require_once将其包含,然后就可以直接使人用类来实例化一个对象。
但随着项目规模的不断扩大,使用这种方式会带来一些隐含的问题:如果一个php文件需要使用很多其它类,那么就需要很多的需要/包括语句,这样有可能会造成遗漏或者包含进不必要的类文件。如果大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。
PHP5为这个问题提供了一个解决方案,这就是类的自动装载(自动装载)机制.autoload机制可以使得php程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件包括进来,这种机制也称为延迟加载。

下面是使用自动装载机制加载人类的例子:

代码如下:


/*自动装载。php */
& lt; ?php
__autoload函数($ classname) {
require_once ($ classname。“class.php");
}
$人=新人(“Altair" 6);
var_dump(人);
?比;



通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。在我们这个简单的例子中,我们直接将类名加上扩展名“.class.php”构成了类文件名,然后使用require_once将其加载。从这个例子中,我们可以看出自动装载至少要做三件事情,第一件事是根据类名确定类文件名,第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用包括/要求即可。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。

因此,当有大量的类文件要包含的时候,我们只要确定相应的规则,然后在__autoload()函数中,将类名与实际的磁盘文件对应起来,就可以实现延迟加载的效果。从这里我们也可以看出__autoload()函数的实现中最重要的是类名与实际的磁盘文件映射规则的实现。

但现在问题来了,如果在一个系统的实现中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。在这种情况下,难道就没有更简单清晰的解决办法了吧?答案当然是:不!在看进一步的解决方法之前,我们先来看一下PHP中的自动装载机制是如何实现的。

<强>二,PHP的自动装载机制的实现

我们知道,PHP文件的执行分为两个独立的过程,第一步是将PHP文件编译成普通称之为操作码的字节码序列(实际上是编译成一个叫做zend_op_array的字节数组),第二步是由一个虚拟机来执行这些OPCODE.PHP的所有行为都是由这些操作码来实现的,因此,为了研究PHP中自动装载的实现机制,我们将自动装载。php文件编译成操作码,然后根据这些操作码来研究php在这过程中都做了些什么:

代码如下:


/*自动装载。php编译后的操作码列表,是使用作者开发的OPDUMP工具
*生成的结果,可以到网站http://www.phpinternals.com/下载该软件。

怎么在PHP项目中实现一个自动装载机制