我需要spl_autoload_register来覆盖__autoload

时间:2013-02-20 17:14:30

标签: php autoload

我正在使用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());
        }

1 个答案:

答案 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(是否已包含它?)