我是一个不断增长的PHP + QuickBooks相关代码库的作者。我想利用PHP __autoload()函数,但是我的代码是一个库,其他人可以在自己的应用程序中包含(),所以我不能依赖尚未定义的__autoload()。
是否有一种拥有多个__autoload()函数的方法?
我在PHP手册中看到了spl_autoload_register(),但并不是所有的用户都安装了SPL扩展,所以我不能依赖它。如果有办法回过头来使用它,默认情况下使用普通的require/include语句,我可能会考虑这一点。
有没有其他人对这个问题有其他聪明的解决办法?只有一个__autoload()函数似乎是一个明显的疏忽.
发布于 2010-03-18 14:45:50
--我在PHP手册中看到了spl_autoload_register(),但并不是所有的用户都安装了SPL扩展,所以我不能依赖它。
忽略它们,它是默认编译的,甚至在5.3.0中都不能禁用。不要为了取悦少数人而牺牲你的框架。
发布于 2010-03-19 14:48:00
我已经决定,要做到这一点,并保持向后兼容性,方法是编写我自己的"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安装支持它,否则就会回到只执行常规的require $file;输入This。
发布于 2012-01-16 08:23:36
您可以编写一个__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);
}注意:这是“不戴袖口”,我还没有测试过。
https://stackoverflow.com/questions/2470664
复制相似问题