当使用以下php SplClassLoader.php时,我们是否需要为每个命名空间提供多个实例?


Do we need multiple instances for each namepace when using following php SplClassLoader.php

在比较了SplClassLoader的两个版本后,我有点困惑

一个在这里:https://gist.github.com/jwage/221634

如果我们有多个名称空间,我认为需要多个实例,正如实现建议的

另一个是https://wiki.php.net/rfc/splclassloader,这看起来很不错,但我没有找到git版本。使用add()方法添加多个包含路径似乎很简单。

如果有人确认我在想什么,并建议我一个以上或更好的一个,我将不胜感激。

谢谢

如果您为名称空间(第一个参数)传递null,则可以在include路径(第二个参数)下加载任何名称空间:

$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并继续您的代码。