我正在使用php更新一些旧对象和更新的对象。该站点当前有一个__autoload函数,它只调用include
目录中的.inc文件。我使用spl_autoload_register为更新的对象创建了一个新的自动加载功能。它使用名为lib
的目录和名称空间。
我有一个名为Sample的对象,旧对象(也称为Sample)引用include/sample.inc
中的定义。然后新对象路径为lib/Sample.php
。我的问题是,即使我在调用该对象的页面上使用spl_autoload_register,它仍然在调用旧对象。这是我的代码(请注意__autoload()是在到达此页面之前定义的。)
<?php
spl_autoload_register('autoload_lib');
$sample_id = req('sample_id');
$alert = req('alert');
if (!empty($sample_id))
{
$sample = new Sample($sample_id);
var_dump($sample); die();
$referral = $sample->Referral();
matry::open (get_defined_vars());
}
else
{
matry::open(get_defined_vars());
}
答案 0 :(得分:2)
当你开始使用spl _...方法时,它们会篡夺任何现有的__autoload函数:
如果你的代码有一个现有的__autoload()函数,那么这个函数 必须在__autoload堆栈上显式注册。这是因为 spl_autoload_register()将有效地替换引擎缓存 __autoload()函数由spl_autoload()或 spl_autoload_call()。
人们可以在一个简单的例子中看到这一点:
<?php
ini_set('display_errors', 1);
function __autoload($className) {
exit("__autoload");
}
spl_autoload_register(function($className) {
exit("spl_autoload");
});
// try to create nonexistent class
new Foo();
?>
以上示例输出“spl_autoload”
您确定在脚本的该阶段没有注册其他自动加载器吗?您可以通过添加prepend参数来测试这一点(例如,spl_autoload_register('autoload_lib',true,true);脚本中当时是否可以调用autoload_lib(是否已包含它?)