使用以下php SplClassLoader.php时,每个名称空间是否需要多个实例

使用以下php SplClassLoader.php时,每个名称空间是否需要多个实例,php,Php,在比较了两个版本的SplClassLoader之后,我有点困惑 一个是: 我认为如果我们有多个名称空间,就需要多个实例,正如实现所建议的那样 另一个是,它看起来很不错,但我在某处找不到git版本。使用add()方法添加多个include路径似乎很简单 如果有人能证实我的想法并向我推荐以上或更好的建议,我将不胜感激 谢谢事实证明,如果为名称空间(第一个参数)传递null,则可以在include路径(第二个参数)下加载任何名称空间: 通常我见过SplClassLoader的示例用法如下: $load

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

一个是:

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

另一个是,它看起来很不错,但我在某处找不到git版本。使用add()方法添加多个include路径似乎很简单

如果有人能证实我的想法并向我推荐以上或更好的建议,我将不胜感激


谢谢

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

通常我见过
SplClassLoader
的示例用法如下:

$loader = new SplClassLoader( 'Mine', 'path\to\libs');
$loader->register();

use Mine\Craft;
$c = new Craft;
- path
  - to
    - libs
      - Mine
        - Craft.php
      - Yours
        - Hovercraft.php
root.php
SplClassLoader.php
如果您只想在
Mine
名称空间下加载类,这很好。但是如果您想使用
您的
名称空间,该怎么办?你可以这样做:

$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;
这假设您的目录结构如下:

$loader = new SplClassLoader( 'Mine', 'path\to\libs');
$loader->register();

use Mine\Craft;
$c = new Craft;
- path
  - to
    - libs
      - Mine
        - Craft.php
      - Yours
        - Hovercraft.php
root.php
SplClassLoader.php
当然,您的类名称空间遵循标准:
Craft.php

namespace Mine;

class Craft
{
…
}

现在,我不能评论这种方法的安全性。我想能够将某些名称空间列入白名单是件好事?不确定它是否是一个安全特性,看起来更像是某种内置的灵活性,因此您不必将所有库放在一个位置。但就我而言,这一切都是为了简洁和简单。合并依赖项,传递
null
并继续使用代码。

我想知道同样的问题:使用
SplClassLoader
时,是否需要为和
register()
每个根命名空间创建一个实例?似乎是一个奇怪的设计。@MarkFox我决定使用Zend 2 autoloader,它很好而且干净,有多个接口来做这类事情。这是一个很好的教程,从它开始,它看起来确实不错。检查我的答案,你可能喜欢两者。空方法为+1,但我想要的是加载所有名称空间的单个实例。我的解决方案隐式地适用于任何和所有名称空间。您是说希望通过一个实例加载多个特定名称空间?