PHP高级——autoload(类的自动加载)机制

通常我们在引用外部 class 时,会直接使用 include(include_once) 和 require(require_once) 函数来把 class 文件包含进来。这种做法在大型项目中并不可取,原因是:大型项目需要引用更多的 class 文件,从而使得代码难以维护且降低整体性能。因此PHP官方提供了这样一种解决方案——autoload 机制。

PHP内部的 autoload 机制:

php内部提供两种方法来实现自动装载机制,一种是使用用户自定义的 _autoload 函数。另外一种就是设计一个函数,将执行器全局变量函数指针 autoload_func 指向它,这通常使用C语言在PHP扩展中实现。 如果既实现了__autoload()函数,又实现了autoload_func(将autoload_func指向某一PHP函数),那么只执行autoload_func函数。

autoload 发展史 :

早先,PHP5 在使用一个类的时候,如果这个类没有加载,就会自动运行 _autoload 函数,我们需要自己先实现一个 _autoload 函数,这个 _autoload 函数需要做三件事:根据类名得到实际类文件名,确定该类文件的实际磁盘路径,加载该类文件。这种方法的缺点是:在面对大量的类文件时,该函数编写会变得很复杂,相较于原来维护可能会方便一点点,还是会影响整体性能。

目前,我们采用的是 SPL autoload 机制(Standard PHP library)。这种机制是将函数指针 autoload_func 指向 spl_autoload 或 spl_autoload_call 函数来实现两种加载方式。

  • spl_autoload($class_name,$file_extensions) 通过使用 spl_autoload_register() 就可以将 autoload_func 指向 spl_autoload()。 接受两个参数,参数一是类名,参数二类文件的扩展名。该函数和 require/include 差不多,不同的是可以指定多个扩展名。不推荐
  • spl_autoload_call() 简单的按照顺序执行 SPL 模块内部的全局变量 autoload_functions(本质上是一个HashTable,若看成链表的话,链表中每一个元素都是一个函数指针,指向一个具有自动加载类功能的函数)中的每个函数,每个函数执行完都要判断需要的类是否加载,如果加载成功就直接返回,否则就继续执行剩余其他的函数。如果所有函数都执行完类还没有加载,spl_autoload_call 就直接退出,不会报错。autoload_functions 是由 spl_autoload_register 和 spl_autoload_unregister 来维护的。推荐

实际使用中,我们可以根据每个类库不同的命名机制是实现各自的自动加载函数,然后使用 spl_autoload_register 分别注册到 autoload_functions 中,就不用维护一个复杂的 _autoload 函数了。



每一个人其实都是一本书。有人是名著,有人是禁书,有人是菜谱,有人是地图,有人是美图秀秀使用手册,有人是小旅馆的登记簿。。。

整个世界就是一个巨大的图书馆,我们读着别人,书写着自己,等着被读。

—— 豆瓣用户很呛

Posted

in

by

Tags: