为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中没有用处,所以这也是一个不好的做法。
这种模块使用什么模式?
答
我觉得这个讨论会在你决定帮助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();
答
简单,使用一个类,但不要使这些方法是静态的。当然,这意味着你将使用一条额外的线来实例化它,这不是什么大问题。你将能够正确地扩展这个类,并且为了测试而模拟它。
这是一个不好的做法,采取传闻的建议。 - 你的例子太抽象了,不推荐使用其他实现。然而,显然将输入函数引入对象并不是非常明智的。虽然它们应该是普通的函数,但静态类是功能分组的一个可接受的解决方法(仅此而已)。特别是如果你无法忍受命名空间的语法替代。 – mario 2012-02-02 02:57:22