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