首页 » PHP技术 » smarty3 __autoload()失效的问题

smarty3 __autoload()失效的问题

 

自己想的一套架构算是采用了,昨天部署在开发服务器上,前段童鞋碰到一个问题,当采用包含非分布式的时候,会提示类没有被声明,但是单个接口就没问题,经过仔细查找,发现是__autoload()没有被执行

解决代码如下

[php]

function autoload($className) {
require_once dirname(__FILE__) . './../../class/' . $className . '.class.php';
}

spl_autoload_register('autoload');

[/php]

这个原因是

PHP函数__autoload()和spl_autoload_register()

__autoload($classname){

}

当PHP找不到类文件会调用这个方法,当注册了自己的函数或方法时,PHP不会调用__autoload()函数,而会调用自定义的函数

spl_autoload_register('func_name');

spl_autoload_register(array('class_name','method_name'));

详细说明如下

spl_autoload_register
(PHP 5 >= 5.1.2)

spl_autoload_register — 注册__autoload()函数

说明
bool spl_autoload_register ([ callback $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的声明使得auto失去作用,__autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法。

 

看来自己不懂的依旧很多,继续努力学习成长。

顺便吐槽下网速,真不给力,下个月打算自己用2M的宽带得了,维护网络费心费力不讨好。

原文链接:smarty3 __autoload()失效的问题,转载请注明来源!

0