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()函数是否定义。

发布了36 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tyro_blog/article/details/50095685