php魔术方法__autoload(),有需要的朋友可以参考下。
__autoload()方法是一个特殊函数,它不是一个类方法,而是单独的函数,在类外被声明,将在实例化一个还没被声明的类中调用。
举个栗子:
- require_once('test/A.php');
- require_once('test/B.php');
- require_once('test/C.php');
-
- if (条件A) {
- $a = new A();
- $b = new B();
- $c = new C();
- } else if (条件B) {
- $a = newA();
- $b = new B();
-
- }
复制代码
这样写就会出现一个问题,当在条件B下实例化B类时,其实是不需要引用A,C文件的,所以栗子中的做法就会浪费一部分资源去编译A,C两个“无用的类”;所以这时候我们就可以使用__autoload()函数来解决这个问题。
- function __autoload($className) {
- $filePath = “test/{$className}.php”;
- if (is_readable($filePath)) {
- require($filePath);
- }
- }
-
- if (条件A) {
- $a = new A();
- $b = new B();
- $c = new C();
- } else if (条件B) {
- $a = newA();
- $b = new B();
- }
复制代码
当php引擎第一次使用类A,但是找不到时,会自动调用__autoload方法,并将类名“A”作为参数传入。所以,我们需要的做的就是根据类名,找到对应的文件,并包含进来,如果我们的方法也找不到,那么php引擎就会报错。注意,这里可以只用require,因为一旦包含进来后,php引擎再遇到类A时,将不会调用__autoload,而是直接使用内存中的类A,不会导致多次包含。
现在讲一下autoload的运行机制,PHP在实例化一个对象时(实际上在实现接口,使用类常数或类中的静态变量,调用类中的静态方法时都会如此),首先会在系统中查找该类(或接口)是否存在,如果不存在的话就尝试使用autoload机制来加载该类。而autoload机制的主要执行过程为:
(1) 检查执行器全局变量函数指针autoload_func是否为NULL。
(2) 如果autoload_func==NULL, 则查找系统中是否定义有__autoload()函数,如果没有,则报告错误并退出。
(3) 如果定义了__autoload()函数,则执行__autoload()尝试加载类,并返回加载结果。
(4) 如果autoload_func不为NULL,则直接执行autoload_func指针指向的函数用来加载类。此时并不检查__autoload()函数是否定义。
|