php5 __autoload应用与include性能对比
发布:smiling 来源: PHP粉丝网 添加日期:2014-08-06 13:56:47 浏览: 评论:0
php5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写,代码如下:
- function __autoload($classname) {
 - include_once $classname . '.class.php';
 - }
 - $user = new user();
 
当php引擎试图实例化一个未知类的操作时,会调用__autoload()方法,在php出错失败前有了最后一个机会加载所需的类,因此,上面的这段代码执行时,php引擎实际上替我们自动执行了一次__autoload方法,将user.class.php这个文件包含进来.
在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误,如果使用 php的cli交互模式时,自动加载机制将不会执行.
当你希望使用pear风格的命名规则,例如需要引入user/register.php文件,也可以这么实现,代码如下:
- //加载我
 - function __autoload($classname) {
 - $file = str_replace('_', directory_separator, $classname);
 - include_once $file . 'php';
 - }
 - $userregister = new user_register();
 
这种方法虽然方便,但是在一个大型应用中如果引入多个类库的时候,可能会因为不同类库的autoload机制而产生一些莫名其妙的问题,在php5引入spl标准库后,我们又多了一种新的解决方案,spl_autoload_register()函数.
此函数的功能就是把函数注册至spl的__autoload函数栈中,并移除系统默认的__autoload()函数,一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用__autoload()函数,下例调用的是user/register.php而不是user_register.class.php,代码如下:
- //不加载我
 - function __autoload($classname) {
 - include_once $classname . '.class.php';
 - }
 - //加载我
 - function autoload($classname) {
 - $file = str_replace('/', directory_separator, $classname);
 - include_once $file . '.php';
 - } //开源代码phpfensi.com
 - //开始加载
 - spl_autoload_register('autoload');
 - $userregister = new user_register();
 
在使用spl_autoload_register()的时候,我们还可以考虑采用一种更安全的初始化调用方法,代码如下:
- //系统默认__autoload函数
 - function __autoload($classname) {
 - include_once $classname . '.class.php';
 - }
 - //可供spl加载的__autoload函数
 - function autoload($classname) {
 - $file = str_replace('_', directory_separator, $classname);
 - include_once $file . '.php';
 - } //开源代码phpfensi.com
 - //不小心加载错了函数名,同时又把默认__autoload机制给取消了……
 - spl_autoload_register('_autoload', false);
 - //容错机制
 - if(false === spl_autoload_functions()) {
 - if(function_exists('__autoload')) {
 - spl_autoload_register('__autoload', false);
 - }
 - }
 
php autoload与include性能比较
p为1000时,脚本耗时约0.076701879501343秒.
如果我们用autoload实现呢?代码如下:
- #file:php_autoload.php
 - function __autoload($class_name) {
 - include_once $class_name . '.php';
 - }
 - for($i = 0;$i < $loop;$i++) {
 - new simpleclass();
 - }
 
在这段代码中,我定义了__autoload函数,几乎一样的脚本,当$loop为1时,耗时0.0002131462097168秒,而当$loop为1000时,耗时仅为前面代码的1/7,0.012391805648804秒.
但请注意看simpleclass的代码,其中输出了一行字符串,如果去掉这行输出后再比较,会是什么样的结果呢?
在$loop同为1000的情况下,前者耗时0.057836055755615秒,而使用了autoload后,仅仅0.00199294090271秒,效率相差近30倍.
从上面的测试可以看出,当文件仅仅被include一次,autoload会消耗稍微多一点的时间,但如果在文件被反复include的情况下,使用autoload则能大大提高系统性能.
Tags: __autoload include 性能对比
- 上一篇:PHP面向接口编程,耦合设计模式
 - 下一篇:php 模版设计模
 
相关文章
- ·PHP魔术函数__autoload的用法与一些问题(2013-12-03)
 - ·PHP autoload实现自动加载类(2014-01-16)
 - ·php自动加载类__autoload()的方法(2014-02-20)
 - ·php spl_autoload_register与__autoload方法详解(2014-05-20)
 - ·PHP中的魔术方法总结(2014-07-29)
 - ·php中__autoload()方法详解(2014-09-02)
 
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
 - PHP新手上路(一)(7)
 - 惹恼程序员的十件事(5)
 - PHP邮件发送例子,已测试成功(5)
 - 致初学者:PHP比ASP优秀的七个理由(4)
 - PHP会被淘汰吗?(4)
 - PHP新手上路(四)(4)
 - 如何去学习PHP?(2)
 - 简单入门级php分页代码(2)
 - php中邮箱email 电话等格式的验证(2)
 
