使用以下php Spl ClassLoader.php时,我们是否需要为每个命名空间设置多个实例

时间:2013-03-05 12:42:16

标签: php

在比较两个版本的SplClassLoader

后,我感到有点困惑

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

如果我们有多个名称空间,我认为需要多个实例,正如实现所暗示的那样

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

如果有人确认我的想法并建议我上述或更好的一个,我会很感激。

谢谢

1 个答案:

答案 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并继续使用您的代码。