php自动加载为什么autoload被抛弃了

查看了许多资料
1 如果100个文件 都要用 都要一个一个include进来
所以有了这种autoload加载
但是看到网上说 这种autoload 有缺点就是只能加载一次 这加载一次怎么理解呢?
如果我在autoload对文件名字作判断 然后include不同目录的php文件不也可以吗?
我主要想知道 这个autoload 如何 过渡到spl_autoload 还有 只能加载一次这个怎么说?

阅读 4.2k
2 个回答

spl_autoload_register和__autoload都是PHP自动加载的两种方式。自从spl_autoload_register出现后,已经逐渐替代了__autoload.虽然二者实现的最终功能一样,但是不同的是spl_autoload_register可以注册多种加载机制。而__autoload只可以定义一次。

比如,现在需要加载目录A和目录B内的类,A目录中定义所有文件名和类名一致,B目录下的文件名和类名也一样,但是会多一个和类名一样的目录,比如类MapA,存放在目录b/MapA/MapA.php,那么A和B注册加载机制不一样,如果用__autoload就需要多从判断,而spl_autoload_register分开写两种注册机制,都进行注册就好了。其实只是spl_autoload_register比__autoload更灵活而已。

function load1($className)
{
    echo 1;
    if (is_file($className . '.php')) {
        require $className . '.php';
    }
}
function load2($className)
{
    echo 2;
    if (is_file('./app/' . $className . '.php')) {
        require './app/' . $className . '.php';
    }
}

//注册了2个
spl_autoload_register('load1');
spl_autoload_register('load2');
$db = new DB(); 
$info = new Info(); 

spl_autoload_register内部维护了一个队列,后注册的在队首,加载类的时候依次调用队列中的加载函数,直至类加载成功

详解请参考PHP autoload 机制详解

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏