好吧,在比较了两个版本的 SplClassLoader 之后,我有点困惑
一个在这里:https ://gist.github.com/jwage/221634
如果我们有多个命名空间,我认为需要多个实例,正如实现所建议的那样
另一个是https://wiki.php.net/rfc/splclassloader,看起来不错,但我在某处找不到 git 版本。使用 add() 方法添加多个包含路径似乎很简单。
如果有人确认我的想法并建议我上述一种或更好的一种,我将不胜感激。
谢谢
好吧,在比较了两个版本的 SplClassLoader 之后,我有点困惑
一个在这里:https ://gist.github.com/jwage/221634
如果我们有多个命名空间,我认为需要多个实例,正如实现所建议的那样
另一个是https://wiki.php.net/rfc/splclassloader,看起来不错,但我在某处找不到 git 版本。使用 add() 方法添加多个包含路径似乎很简单。
如果有人确认我的想法并建议我上述一种或更好的一种,我将不胜感激。
谢谢
事实证明,如果您传递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
并继续使用您的代码。