gpt4 book ai didi

PHP 全局命名空间别名

转载 作者:行者123 更新时间:2023-12-04 16:51:28 24 4
gpt4 key购买 nike

这是场景。

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

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

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

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

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']);

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

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

最佳答案

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

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

例子:

class arr extends BridgeLibName\Stdlib\Arrays{

}

要记住的一件重要事情:

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

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

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

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

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

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

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

刚刚想到了对这种方法的修正,以解决不必要的类实例化问题。

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

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

在 Composer 中,你这样描述它:
"autoload": {
"psr-0": {
"BridgeLibName\\": "."
},
"classmap": ["include/"]
}

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

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

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

关于PHP 全局命名空间别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com