首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP多重__autoload函数*不使用* spl_register_autoload?

PHP多重__autoload函数*不使用* spl_register_autoload?
EN

Stack Overflow用户
提问于 2010-03-18 14:42:30
回答 3查看 2K关注 0票数 2

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

是否有一种拥有多个__autoload()函数的方法?

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

有没有其他人对这个问题有其他聪明的解决办法?只有一个__autoload()函数似乎是一个明显的疏忽.

EN

回答 3

Stack Overflow用户

发布于 2010-03-18 14:45:50

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

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

票数 7
EN

Stack Overflow用户

发布于 2010-03-19 14:48:00

我已经决定,要做到这一点,并保持向后兼容性,方法是编写我自己的"Loader“类。

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

代码语言:javascript
复制
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;输入This。

票数 3
EN

Stack Overflow用户

发布于 2012-01-16 08:23:36

您可以编写一个__autoload函数,它简单地遍历一个回调数组,这些回调将执行实际的类加载,直到找到类或列表被耗尽为止。

代码语言:javascript
复制
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);
}

注意:这是“不戴袖口”,我还没有测试过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2470664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档