Home  >  Article  >  Backend Development  >  spl_autoload_register()真的可以做到不同第三方类库使用自己的自加载吗?

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

WBOY
WBOYOriginal
2016-06-06 20:36:52897browse

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了,注册的加载函数“不属于命名空间”,那么怎么能做到不同第三方类库使用自己的注册的自加载呢?

回复内容:

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了,注册的加载函数“不属于命名空间”,那么怎么能做到不同第三方类库使用自己的注册的自加载呢?

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

真的…………

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

<code>php</code><code><?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();
</code></code>

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

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

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

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

<code>php</code><code>new \spaceA\Something()
new \spaceB\Something()
</code>

问题 3: 效率低怎么办?

效率低也要看低在哪里

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

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

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

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

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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn