php框架之__autoload(自动加载)问题

来源:互联网 发布:软路由软件 编辑:程序博客网 时间:2024/06/06 05:20

1:自动加载产生的背景(为什么会有?):

在php开发中,为了提高可维护性,可扩展性等,我们经常会按照MVC的思想,将一些功能封装成类(class),比如将连接数据库,sql查询等封装成诸如mysql.class.php这样的文件,再使用时,通过require/require_once将其引入,然后实例化,$mysql = new Mysql();,进而按照对象---方法的方式调用。这是一种较好的编程方式。

然后,当我们的业务逻辑十分复杂时,也许这样的***.class.php会很多(我们封装的为实现各种功能的class),而在每个需要实例化某个类的php文件中,都使用require/require_once的方式分别引入,会显得很乱,最重要的是,会产生,重复引入,遗漏等问题。自动加载,也正是为了解决这个问题而产生的。

事实上,自动加载,并非只是“简洁,避免重复”,更重要的是:它是自动加载那些使用到的类。言外之意,避免了加载那些不需要的类,而降低系统效率。

2:自动加载的使用场景:

很显然,当我们有很多***.class.php文件的时候,使用自动加载机制会非常方便。

3:自动加载怎么用:

首先假设我们用一个Person类,文件名为 Person.class.php。如下:


在另一个aa.php里,我们需要实例化这个类,传统的做法如下:


这样做也未尝不可,但在我们需要实例化很多类的时候,其弊端也就展露无疑了。

自动加载的做法是这样子的:


这样,在32行时,系统发现,我们实例化了一个尚未加载到系统的类Person,就会尝试通过自动加载的方式去加载该文件(person.class.php)

试想一下,这样的做法,我们并不需要实现想好需要加载那个类,而以require_once的方式写一大堆加载文件的代码。同时,这样的方式是”响应式“的,即:需要才加载,不需要不加载,需要什么加载什么。

4:自动加载的注意事项:

首先,我们看一下,__autoload函数都做了些什么工作:

(1)它确定了一个:类名和文件名的映射规则。

Person类,对应person.class.php

(2)它暗含了一个加载路径的问题。

本例中,aa.php和perso.class.php在同一目录下,因而没有体现。

(3)它把相应的类文件加载到了系统当中。这很明显。

所以,我们在使用__autoload函数自动加载的时候,需要注意:

(1)类和文件名有一个明确,简单的映射规则。

比如,我们以类名为文件名,并且以class.php为后缀名(这种说法不太严谨)。这也是我们常见的映射规则。

(2)加载路径include_path

1.php默认的包含路径为 .;C:\php\pear 即为当前目录和C:\php\pear目录

2.如果设置ini_set("include_path", ""); 则改变为默认们目录(即为上面的)
运行时的包含顺序:
1.如果为绝对路径 则直接包含, 并结束(找不到直接退出).
2.如果是是相对路径((形如./file, ../dir/file) 则跳过include_path的作用逻辑, 直接解析相对路径(找不到直接退出)
   注意:在使用相对路径的包含文件的情况下,如果一个文件被另一个文件所包含,则这个文件的”相对“则指的是包含他的那个文件
3.都不是以上两种情况
会根据include_path,和当前执行文件的path组成一个待选的目录列表 (即先include path 再当前文件所在的目录,注意:文件的真实目录)
然后, 依次从待选列表头部开始, 根据PATH_SEPARATOR(windows下是”;”,linux下是":")取出待选列表中的一个路径, 然后把要包含的文件名附加在这个路径后面,进行尝试. 如果成功包含, 则返回(不在向下寻找), 否则继续下一个待选路径.



0 0
原创粉丝点击