class Application {
protected static $_singletonFoo=NULL;
public static function foo() {
if(NULL === self::$_singletonFoo) {
self::$_singletonFoo = new Foo;
}
return self::$_singletonFoo;
}
}
这就是我要做的方式。它按需创建对象:
Application::foo()->bar();
这是我的工作方式,它尊重OOP原则,比您现在做的要少的代码,仅在第一次需要代码时才创建对象。
注意:我所介绍的甚至不是真正的单例模式。通过将构造函数(Foo :: __ constructor())定义为私有,单例将仅允许其自身的一个实例。它只是对所有“应用程序”实例可用的“全局”变量。这就是为什么我认为它的使用是有效的,因为它不会忽略良好的OOP原则。当然,与世界上任何事物一样,此“模式”也不应过度使用!
我已经看到许多PHP框架,Zend框架和Yii中都使用了它。您应该使用一个框架。我不会告诉你哪一个。
附录
对于那些担心TDD的人,您仍然可以组成一些线路来进行依赖注入。它可能看起来像这样:
class Application {
protected static $_singletonFoo=NULL;
protected static $_helperName = 'Foo';
public static function setDefaultHelperName($helperName='Foo') {
if(is_string($helperName)) {
self::$_helperName = $helperName;
}
elseif(is_object($helperName)) {
self::$_singletonFoo = $helperName;
}
else {
return FALSE;
}
return TRUE;
}
public static function foo() {
if(NULL === self::$_singletonFoo) {
self::$_singletonFoo = new self::$_helperName;
}
return self::$_singletonFoo;
}
}
有足够的改进空间。只是一个PoC,请发挥您的想象力。
为什么会这样呢?好吧,在大多数情况下,该应用程序不会进行单元测试,而是可以在生产环境中运行。PHP的优势在于它的速度。PHP不是,永远不会像Java这样的“干净的OOP语言”。
在一个应用程序中,最多只有一个Application类,并且每个助手最多只有一个实例(按上述延迟加载)。当然,单身人士很糟糕,但只有在不遵守现实世界的情况下,这又是一次。在我的例子中,他们做到了。
刻板的“规则”(例如“坏人”)是邪恶的根源,它们是给那些不愿自己思考的懒惰人提供的。
是的,从技术上讲,我知道PHP宣言是BAD。但这是一种成功的语言,以其骇人听闻的方式表现出来。
附录
一种功能样式:
function app($class) {
static $refs = array();
//> Dependency injection in case of unit test
if (is_object($class)) {
$refs[get_class($class)] = $class;
$class = get_class($class);
}
if (!isset($refs[$class]))
$refs[$class] = new $class();
return $refs[$class];
}
//> usage: app('Logger')->doWhatever();