首页  >  文章  >  后端开发  >  php魔术方法__autoload()

php魔术方法__autoload()

WBOY
WBOY原创
2016-07-25 08:46:22881浏览

php魔术方法__autoload(),有需要的朋友可以参考下。


__autoload()方法是一个特殊函数,它不是一个类方法,而是单独的函数,在类外被声明,将在实例化一个还没被声明的类中调用。
举个栗子:

  1. require_once('test/A.php');
  2. require_once('test/B.php');
  3. require_once('test/C.php');
  4. if (条件A) {
  5. $a = new A();
  6. $b = new B();
  7. $c = new C();
  8. } else if (条件B) {
  9. $a = newA();
  10. $b = new B();
  11. }
复制代码

这样写就会出现一个问题,当在条件B下实例化B类时,其实是不需要引用A,C文件的,所以栗子中的做法就会浪费一部分资源去编译A,C两个“无用的类”;所以这时候我们就可以使用__autoload()函数来解决这个问题。

  1. function __autoload($className) {
  2. $filePath = “test/{$className}.php”;
  3. if (is_readable($filePath)) {
  4. require($filePath);
  5. }
  6. }
  7. if (条件A) {
  8. $a = new A();
  9. $b = new B();
  10. $c = new C();
  11. } else if (条件B) {
  12. $a = newA();
  13. $b = new B();
  14. }
复制代码

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

php


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn