PHP多个__autoload函数*没有*使用spl_register_autoload?

时间:2010-03-18 14:42:31

标签: php autoload

我是一个不断增长的PHP + QuickBooks相关代码库的作者。我想利用PHP的__autoload()函数,然而我的代码是一个其他人可以包含()到自己的应用程序中的库,所以我不能依赖__autoload()定义。

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

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

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

3 个答案:

答案 0 :(得分:7)

  

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

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

答案 1 :(得分:3)

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

我没有使用require_once'TheFile.php',而是使用Loader :: load('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安装支持它,否则回到正常需要$ file;类型的东西。

答案 2 :(得分: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);
}

注意:这是“关闭袖口”,我没有测试过。