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 静态类的主要内容,如果未能解决你的问题,请参考以下文章

php静态方法

PHP:单例与静态类 [重复]

php中静态方法的使用

PHP静态方法与非静态方法用法及区别

PHP-----静态

php中static静态类与static 静态变量用法区别