search

Home  >  Q&A  >  body text

php - spl_autoload_register()真的可以做到不同第三方类库使用自己的自加载吗?

namespace a1;
function a($name)
{
echo $name;
}
spl_autoload_register('a1\a');
namespace a2;
function a($name)
{
echo $name;
}
spl_autoload_register('a2\a');
new a; // 实例化a2\a,但是为什么却先触发了a1\a,然后再触发a2\a
// 我用文件引用的方式也还是这样,但是如果a1\a找到了类文件,则不会在触发a2\a了,注册的加载函数“不属于命名空间”,那么怎么能做到不同第三方类库使用自己的注册的自加载呢?

大家讲道理大家讲道理2818 days ago594

reply all(3)I'll reply

  • 阿神

    阿神2017-04-10 15:29:49

    每个库忽略掉自己不能够加载的类即可

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:29:49

    真的…………

    好吧,我只看了题主的标题。这会儿整理下题主的代码,尽量细说一下……

    php<?php
    namespace spaceA;
    function loadA($name)
    {
        echo "loadA:".$name."\n";
    }
    spl_autoload_register('\spaceA\loadA');
    
    namespace spaceB;
    function loadB($name)
    {
        echo "loadB:".$name."\n";
    }
    spl_autoload_register('\spaceB\loadB');
    
    new Something();
    

    问题 1:为啥先调 \spaceA\loadA ?

    随便哪个顺序都没啥影响吧?再说,按你传入的顺序调有啥不妥咩?

    问题 2: 怎么能做到不同第三方类库使用自己的注册的自加载呢?

    不同类库的类名不一样就行了,担心类名冲突的话,不是有命名空间咩?它实际就是类名的前缀,使用时把类名写全就行了。比如:

    phpnew \spaceA\Something()
    new \spaceB\Something()
    

    问题 3: 效率低怎么办?

    效率低也要看低在哪里

    • 查找类文件的路径太慢?
      可以提前建立索引,通常会提前建好类名(注意命名空间其实就是类名的前缀)到类定义文件的映射,方便你通过完整的类名直接取到类定义的文件路径。或者像Java那样规范好类的目录,正如 fig 这个社区组织所整理的的 PSR-4 那样。

    • 类加载函数调用的次数太多?
      每个类定义文件只会加载一次,runtime找到类的定义后就不再调用你的"类加载函数"了。一般项目里能引用多少三方库?能注册多少个加载函数?能有多少类文件?万一得用十万百万千万来计数的话,回头请给个基准测试数据过来摔在在下的脸上,顺便也摔在php开发组的脸上,到时大家一起边掐边哭边研究下下hiahiahia…………。

    • 预留问题(在下暂时想不出了……)

    关于spl-autoload-register的使用,详情请参考文档 http://php.net/manual/zh/function.spl-autoload-register.php

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:29:49

    我懂了,http://www.thinkphp.cn/document/474.html
    spl_autoload_register() 会将一个函数注册到 autoload 函数列表中,当出现未定义的类的时候,SPL [注] 会按照注册的倒序逐个调用被注册的 autoload 函数,这意味着你可以使用 spl_autoload_register() 注册多个 autoload 函数.
    逐个的调用被注册的自动函数,这多么的不理智啊,被注册的自动函数应该“属于某个命名空间”才好啊,项目的各个类库还是存在很很小的耦合性的,万一耦合,加载不该加载的那不就完了啊,真是的,我的理解对不对呢?

    reply
    0
  • Cancelreply