1

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

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

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

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

如果有人确认我的想法并建议我上述一种或更好的一种,我将不胜感激。

谢谢

4

1 回答 1

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

于 2013-04-23T06:32:21.733 回答