为php模块选择什么模式?

问题描述:

我想要一个小小的php模块。该模块将具有纯功能的方法。所以,这只是一个功能集合。所有函数只取决于输入参数获取一些参数并返回结果。为php模块选择什么模式?

我有一些建议:

1.静态类

PHP还没有真正的静态类,所以我只是做了所有的静态方法的类:

class Some_Module 
{ 
    static public function sum($a, $b, $c) 
    { 
     return $a+$b+$c; 
    } 

    static public function method2($a, $b) 
    { 
     return $a-$b+5; 
    } 
} 

这是非常容易使用这样的模块:

$x = Some_module::sum(1,2,3); 

但是,我听说过(这里有很多话题),静态是一种不好的做法。

2.辛格尔顿

这不是那么容易使用:

// we should not to forget to get instance 
$module_instance = new Some_module; 
$x = $module_instance->sum(1,2,3); 

不便是事实,那我们现在应该初始化这个模块。 另外,SO上有大量的主题,其中解释了为什么Singleton在PHP中没有用处,所以这也是一个不好的做法。

这种模块使用什么模式?

+0

这是一个不好的做法,采取传闻的建议。 - 你的例子太抽象了,不推荐使用其他实现。然而,显然将输入函数引入对象并不是非常明智的。虽然它们应该是普通的函数,但静态类是功能分组的一个可接受的解决方法(仅此而已)。特别是如果你无法忍受命名空间的语法替代。 – mario 2012-02-02 02:57:22

我觉得这个讨论会在你决定帮助Static methods: are they still bad considering PHP 5.3 late static binding?

个人而言,这取决于上下文。存储一堆杂项。辅助方法,我更可能将它用作全局和命名空间。在存储特定类别的有限数量的方法时,不需要实例化,静态类可能是一个不错的选择。只是要注意单元测试的目的,许多类在错误的背景下使用静态方法,如cool::method将会是地狱。

// keep it abstract to prevent it from being instantiated 
abstract class Foo { 
    // cannot be altered if inherited, although limitation still exists 
    final public static function bar() { 
     echo 'test'; 
    } 
} 

Foo::bar(); 

简单,使用一个类,但不要使这些方法是静态的。当然,这意味着你将使用一条额外的线来实例化它,这不是什么大问题。你将能够正确地扩展这个类,并且为了测试而模拟它。