PHP全局命名空间别名

时间:2013-11-10 13:33:03

标签: php namespaces global-namespace namespace-organisation

以下是该方案。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

示例:

class arr extends BridgeLibName\Stdlib\Arrays{

}

要记住一件重要的事情:

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

如果使用太多,这可能会对性能产生影响,因为只会根据需要加载别名和命名空间。

由于我只使用它来桥接其他类,因此我的桥文件中的逻辑非常少。

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

我对你的实现不小心,你可以加载很多不必要的东西,导致你的应用变得缓慢和臃肿。


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


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


只是想到修改这个方法来解决不必要的类实例化问题。

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

要使别名自动加载,我创建了一个名为includes的aditional目录,包含在我的命名空间类旁边。

在作曲家中你是这样形容的:

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

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

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

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