Heim > Backend-Entwicklung > PHP-Tutorial > php魔术方法__autoload()

php魔术方法__autoload()

WBOY
Freigeben: 2016-07-25 08:46:22
Original
906 Leute haben es durchsucht

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


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage