PHP 全局命名空间别名


PHP Global namespace aliases

这是场景。

我正在将命名空间实现到我的项目中。

我有自己的自定义桥接库,它调用其他库(如 Zend)来完成繁重的工作。

我在自定义桥库中使用完全限定的命名空间没有问题,但希望在我的控制器、模型和视图中保持代码尽可能简洁。

以下是我想使用的一些别名的示例:

use BridgeLibName'Stdlib'Arrays as arr;
use BridgeLibName'Stdlib'Objects as obj;
use BridgeLibName'Stdlib'Strings as str;
use BridgeLibName'Stdlib'Numbers as num;
use BridgeLibName'Stdlib'File as file;
etc.........

用法示例:

$file = new file('path/to/file.txt');
$file->create();

$obj = arr::toObject(['key1'=>'value1']);

是否可以以任何方式创建可以全局访问且不会在每个文件末尾丢弃的别名或常量?

某种可以使这些别名粘附的引导程序文件。

当我写这个问题时,我想到了一个解决方案。

您可以通过创建扩展命名空间类的类来伪造它。

例:

class arr extends BridgeLibName'Stdlib'Arrays{
}

要记住的一件重要事情:

如果要扩展类,则必须加载命名空间类。

如果使用过多,这可能会对性能产生影响,因为别名和命名空间仅在需要时加载。

由于我只使用它来桥接到其他类,所以我的桥文件中几乎没有逻辑。

这些桥文件反过来正确使用别名和命名空间,从而根据需要加载实际文件。

我不小心实现,您可能会加载很多不必要的东西,并导致您的应用程序变得缓慢和臃肿。


我注意到的一件好事是,像netbeans这样的好IDE似乎也可以使用这种方法进行自动完成。


如果有更好的方法,请告诉我。


只是想到了对此方法的修正,以解决不必要的类实例化问题。

核心库可以与普通的 psr-0 加载器一起使用。

为了让别名自动加载,我在我的命名空间类旁边创建了一个名为 include 的附加目录。

在《作曲家》中,你是这样描述的:

"autoload": {
    "psr-0": {
        "BridgeLibName''": "."
    },
    "classmap": ["include/"]
}
现在,您的

库将按预期从正确的命名空间加载,并且您的别名类将根据需要自动加载。

放入包含目录的类现在可以扩展命名空间的类(如上所示),并且在使用之前将不再加载。

现在,您有了全局别名,而不必通过加载未使用的类来牺牲性能。