纯静态类VS辛格尔顿
写一个PHP应用程序,还有好几类,只有具有静态方法(无需实例方法)。一个例子是NumericValidator
,其中有像checkInteger($toCheck)
方法进行检查,确保参数传递给它的类型是int,和checkGreaterThan($lOperand, $rOperand)
,这确保了左操作数大于右操作数越大,等纯静态类VS辛格尔顿
我知道我可以只是扔每种方法到PHP文件,而不把它们一个类里面,但我想万一API发展到需要实例NumericValidator
在这里采取的OOP方法。
但说实在的问题:怎么是100%的静态方法比有一个类实现一个Singleton设计模式,在整个代码库中使用的每个引用调用相同的实例有什么不同的一类?
例如,这里是我的代码看起来像现在:
public function doSomething($p_iNum)
{
if(!NumericValidator::checkInteger($p_iNum))
// throw IllegalArgumentException
// ...
}
但我可以把所有的NumericValidator
的静态方法到非静态实例方法,迫使程序员实例化,然后执行一个Singleton设计模式,所以你永远只能参考它的1个实例:
public function doSomething($p_iNum)
{
NumericValidator $nv = NumericValidator::getInstance();
if(!nv->checkInteger($p_iNum))
// throw IllegalArgumentException
// ...
}
最后,我的问题:这是在保持机智更好,更h最佳实践?有没有性能方面的考虑?这两种方法如何影响诸如并发性或来自多个用户的请求?
我会在你的例子中使用一个静态类。我将使用的差异性是,如果您试图跨访问保存实例的任何属性状态。这是单身人士设计的。静态类提供了对命名空间中的方法的有组织的访问,这有助于清晰地了解代码,但它没有任何有关其自身的属性。
所以是的,你可以使用单例,但它会是不好的形式,因为没有实例属性,你希望跨页访问提供。
希望这会有所帮助。
- 仅当您要将变量中的NumericValidator的实例传递给某个函数时,才使用Singleton而不是静态类。
-
在PHP 5.3,你可以得到静态类的实例:
类测试 { 公共静态函数实例(){ 打印 'ZZ'; }}
$ Z =新的考验; $ z-> instance();
不要在意在PHP并发请求,它是单线程的,每个进程执行自己的代码。
你为什么要为is_int编写一个包装对象成员函数? – markus 2011-04-15 20:47:21
我使用NumericValidator作为*示例*。实际上,无论我的*示例*是否具有逻辑意义,与我所问的问题无关,这与100%纯静态类与单例之间的性能差异有关。 – user709006 2011-04-15 20:51:03
[静态认为有害](http://kore-nordmann.de/blog/0103_static_considered_harmful.html) – Gordon 2011-04-15 22:08:20