在比较两个版本的SplClassLoader
后,我感到有点困惑一个在这里:https://gist.github.com/jwage/221634
如果我们有多个名称空间,我认为需要多个实例,正如实现所暗示的那样
另一个是https://wiki.php.net/rfc/splclassloader,看起来相当不错但我找不到某个地方的git版本。使用add()方法添加多个包含路径似乎很简单。
如果有人确认我的想法并建议我上述或更好的一个,我会很感激。
谢谢
答案 0 :(得分:2)
事实证明,如果您为命名空间(第一个参数)传递null
,则可以在包含路径(第二个参数)下加载任何命名空间:
$loader = new SplClassLoader( null, 'src');
$loader->register();
通常我会看到SplClassLoader
的示例用法:
$loader = new SplClassLoader( 'Mine', 'path\to\libs');
$loader->register();
use Mine\Craft;
$c = new Craft;
如果您只想在Mine
命名空间下加载类,那么这很好。但是,如果您想使用Yours
命名空间呢?你可以这样做:
$loader = new SplClassLoader( 'Mine', 'path\to\libs');
$loader->register();
$loader = new SplClassLoader( 'Yours', 'path\to\libs');
$loader->register();
use Mine\Craft;
use Your\Hovercraft;
$c = new Craft;
$h = new Hovercraft;
但那似乎啰嗦不是吗?特别是因为它们存放在同一个地方。如果我们有三个或四个名称空间可以使用怎么办?
如果所有命名空间都在同一个目录中,则可能会很懒惰
以下是完整示例root.php
:
require 'SplClassLoader.php';
$loader = new SplClassLoader( null, 'path\to\libs');
$loader->register();
use Mine\Craft;
use Your\Hovercraft;
$c = new Craft;
$h = new Hovercraft;
这假定您的目录结构如下:
- path
- to
- libs
- Mine
- Craft.php
- Yours
- Hovercraft.php
root.php
SplClassLoader.php
当然,你的班级命名空间遵循标准:
Craft.php
namespace Mine;
class Craft
{
…
}
现在,我不能评论这种方法的安全性。我想能够将某些命名空间列入白名单很好吗?不确定它是一个安全功能,看起来更像是一些内置的灵活性,因此您不必将所有库放在一个位置。不过,对于我的钱来说,一切都是为了简洁和简洁。合并后的依赖关系,通过null
并继续使用您的代码。