0

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

1 回答 1

2

当您开始使用 spl_... 方法时,它们会篡夺任何现有的 __autoload 函数:

如果您的代码具有现有的 __autoload() 函数,则必须在 __autoload 堆栈上显式注册此函数。这是因为 spl_autoload_register() 将通过 spl_autoload() 或 spl_autoload_call() 有效地替换 __autoload() 函数的引擎缓存。

可以在一个简单的示例中看到这一点:

<?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 (是否包含它的源代码?)

于 2013-02-20T18:09:10.913 回答