2

我是不断增长的 PHP + QuickBooks 相关代码库的作者。我想使用 PHP 的 __autoload() 函数,但是我的代码是一个库,其他人可以将其 include() 到他们自己的应用程序中,所以我不能依赖尚未定义的 __autoload() 。

有没有办法拥有多个 __autoload() 函数?

我在 PHP 手册中看到了 spl_autoload_register(),并非所有用户都安装了 SPL 扩展,所以我不能依赖它。如果有一种方法可以回退到使用它并默认使用正常的 require/include 语句,我可能会考虑这一点。

还有其他人对此问题有其他聪明的解决方案吗?只能拥有一个 __autoload() 函数似乎是一个明显的疏忽......

4

3 回答 3

7

我在 PHP 手册中看到了 spl_autoload_register(),但并非所有用户都安装了 SPL 扩展,所以我不能依赖它。

忽略它们,它是默认编译的,甚至不能在 5.3.0 中禁用。不要为了取悦少数人而牺牲你的框架。

于 2010-03-18T14:45:50.277 回答
3

我决定解决这个问题并保持向后兼容性的方法是编写我自己的“Loader”类。

我现在使用 Loader::load('TheFile.php'); 而不是使用 require_once 'TheFile.php'。Loader::load() 方法执行以下操作:

if ( the function spl_autoload_register exists )
   register an autoloader
   return true
else 
   check if the file has already been included (static array var with a list of files)
   if not included yet
      require $file
   return true

如果他们的 PHP 安装支持它,这给了我使用自动加载器的灵活性,否则回退到只做正常的 require $file; 类型的东西。

于 2010-03-19T14:48:00.577 回答
1

您可以编写一个 __autoload 函数,该函数简单地循环执行实际类加载的回调数组,直到找到该类或列表已用尽。

function loader1 ($className)
{
    if (is_file ('foo/' . $clasName))
    {
        include ('foo/' . $className);
        return (true);
    }
}

function loader2 ($className)
{
    if (is_file ('bar/' . $clasName))
    {
        include ('bar/' . $className);
        return (true);
    }
}

function loader3 ($className)
{
    if (is_file ('baz/' . $clasName))
    {
        include ('baz/' . $className);
        return (true);
    }
}

function __autoload ($className)
{
    $autoloaders = array (
        'loader1', 
        'loader2', 
        'loader3'
    );
    foreach ($autoloaders as $loader)
    {
        if ($loader ($className))
        return (true);
    }
    throw new Exception ('Failed to find class ' . $className);
}

注意:这是“即兴发挥”,我没有测试过。

于 2012-01-16T08:23:36.403 回答