以下是该方案。
我正在为我的项目实现命名空间。
我有自己的自定义桥库,可以调用像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']);
是否有可能以任何方式创建一个可以全局访问的别名或常量,而不是在每个文件末尾丢弃?
某种类型的引导文件可以使这些别名保持不变。
答案 0 :(得分:2)
当我写这个问题时,我想到了一个解决方案。
您可以通过创建扩展命名空间类的类来伪造它。
示例:
class arr extends BridgeLibName\Stdlib\Arrays{
}
要记住一件重要的事情:
如果要扩展类,则必须加载命名空间类。
如果使用太多,这可能会对性能产生影响,因为只会根据需要加载别名和命名空间。
由于我只使用它来桥接其他类,因此我的桥文件中的逻辑非常少。
这些桥接文件依次正确使用别名和命名空间,从而根据需要加载实际文件。
我对你的实现不小心,你可以加载很多不必要的东西,导致你的应用变得缓慢和臃肿。
我注意到的一件好事是,像netbeans这样的好IDE似乎也可以用这种方法自动完成。
如果有更好的方法,请告诉我。
只是想到修改这个方法来解决不必要的类实例化问题。
核心库可以使用普通的psr-0加载器。
要使别名自动加载,我创建了一个名为includes的aditional目录,包含在我的命名空间类旁边。
在作曲家中你是这样形容的:"autoload": {
"psr-0": {
"BridgeLibName\\": "."
},
"classmap": ["include/"]
}
现在您的库将从正确的命名空间按预期加载,您的别名类将根据需要自动加载。
放入include目录的类现在可以扩展命名空间类(如上所示),并且在使用之前将不再加载。
现在你有了全局别名,而不必通过加载未使用的类来牺牲性能。