PHP PSR-0 静态类
Posted
技术标签:
【中文标题】PHP PSR-0 静态类【英文标题】:PHP PSR-0 Static Class 【发布时间】:2013-02-05 17:03:17 【问题描述】:我正在尝试重写一个 OO php 站点(松散地遵循 MVC 结构),以便它使用命名空间 - 并希望遵循 PSR-0。
在当前站点中,我有一个类(称为 APP),其中充满了静态方法,我到处调用这些方法来处理诸如获取配置数据之类的事情; APP::get_config('key')
。
显然,对于命名空间,我需要调用\TheNameSpace\App::get_config('key')
。我经常使用这个类,所以希望避免每次使用时都必须为命名空间添加前缀。我确实从其他类中调用其中的方法,这些类通常位于子命名空间下 - 因此更改文件顶部的命名空间实际上不会起作用。
所以,我想我的问题是,拥有一个“全局”类的最简单方法是什么,该类的方法可以在任何地方调用,而不必每次都在命名空间前加上前缀?
【问题讨论】:
这与mvc或oop无关。在进行过程式编程时,您只是另一个试图编写面向对象的代码的人。 如果你想要一个全局类,为什么不把它放在全局命名空间中呢?请记住,它们(实际上)是为了避免标识符冲突,而不是无缘无故地无情地包装所有内容。 本质上这是一个糟糕的设计——你应该将依赖注入到需要它们的对象中,而不是调用外部的“上帝”类来获取它们。 【参考方案1】:在脚本顶部添加
use TheNameSpace\App as MyApp
例如。然后你可以像这样使用它
app = new MyApp();
在您的脚本中。当然你不需要在这里使用别名。只是
use TheNameSpace\App
app = new App();
也可以。
实现这一类的全局类是不好的风格,你不应该这样做:
class MyApp extends TheNameSpace\App
....
myApp = new MyApp();
【讨论】:
什么意思?在使用声明中?这只是一个示例,以避免与包含同名类的其他“已使用”命名空间发生干扰。但是感谢您的评论,我添加了一个说明以进行澄清。【参考方案2】:namespace Foo;
use Bar;
那你就不用\Bar\fn
所以在你的情况下:
namspace Foo;
use TheNameSpace\App;
App::get_config('blah')
【讨论】:
【参考方案3】:阅读 php 手册中关于使用/别名命名空间的部分。
http://www.php.net/manual/en/language.namespaces.importing.php
您可以使用“use”来排除命名空间。你可以随意命名。
use TheNamespace\App as App //You can name it anything here
App:config('key');
【讨论】:
以上是关于PHP PSR-0 静态类的主要内容,如果未能解决你的问题,请参考以下文章