2

这是场景。

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

我有自己的自定义桥接库,它调用 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']);

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

某种可以使这些别名保持不变的引导文件。

4

1 回答 1

2

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

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

例子:

class arr extends BridgeLibName\Stdlib\Arrays{

}

要记住的一件重要事情:

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

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

因为我只用它来桥接其他类,所以桥文件中的逻辑很少。

这些桥接文件依次正确使用别名和命名空间,从而根据需要加载真实文件。

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


我注意到的一件好事是,像 netbeans 这样的优秀 IDE 似乎也能够使用这种方法自动完成。


如果有更好的方法来做到这一点,请告诉我。


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

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

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

在作曲家你这样描述它:

"autoload": {
    "psr-0": {
        "BridgeLibName\\": "."
    },
    "classmap": ["include/"]
}

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

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

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

于 2013-11-10T13:33:02.933 回答