首页 > 技术 > spl_autoload_register替代__autoload()

spl_autoload_register替代__autoload()

2015年3月5日 发表评论 阅读评论

PHP5.1.2起废弃了__autoload,那么为什么要用spl_autoload_register来取代__autoload()

最重要的原因是autoload只能定义一个自动加载函数,spl_autoload_register可注册多个自动加载函数到函数栈,实例话对象时会按顺序依次调用之前注册过的加载器来自动加载类定义文件。看起来没什么用,但当多个工程混合使用时有自己不懂同的自动加载类实现时,就能体现出优势了。

__autoload()是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。
printit.class.php

index.php

访问index.php会输出hello world。在index.php中,没有包含printit.class.php,在实例化PRINTIT时,自动调用__autoload函数,参数$class的值即为类名PRINTIT,此时printit.class.php就被包含到index.php中,避免到处都是include或require,程序更加简洁。

spl_autoload_register()

bool spl_autoload_register ([ callback $autoload_function ] )
将函数autoload_function注册到SPL提供的__autoload函数栈中。
如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。
因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或spl_autoload_call()。

参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数spl_autoload()。

返回值
如果成功则返回 TRUE,失败则返回 FALSE。

注:SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

spl_autoload_register实例

修改index.php中的__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,需要使用spl_autoload_register()注册到自动加载函数栈中,然后PHP碰到没有定义的类实例化new时就执行loadprint(),参数时类名PRINTIT。

spl_autoload_register() 调用静态方法

分类: 技术 标签:
  1. 8787
    2016年8月16日11:53 | #1

  1. 本文目前尚无任何 trackbacks 和 pingbacks.