2011-04-15 65 views
2

写一个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最佳实践?有没有性能方面的考虑?这两种方法如何影响诸如并发性或来自多个用户的请求?

+0

你为什么要为is_int编写一个包装对象成员函数? – markus 2011-04-15 20:47:21

+0

我使用NumericValidator作为*示例*。实际上,无论我的*示例*是否具有逻辑意义,与我所问的问题无关,这与100%纯静态类与单例之间的性能差异有关。 – user709006 2011-04-15 20:51:03

+1

[静态认为有害](http://kore-nordmann.de/blog/0103_static_considered_harmful.html) – Gordon 2011-04-15 22:08:20

回答

1

我会在你的例子中使用一个静态类。我将使用的差异性是,如果您试图跨访问保存实例的任何属性状态。这是单身人士设计的。静态类提供了对命名空间中的方法的有组织的访问,这有助于清晰地了解代码,但它没有任何有关其自身的属性。

所以是的,你可以使用单例,但它会是不好的形式,因为没有实例属性,你希望跨页访问提供。

希望这会有所帮助。

0
  1. 仅当您要将变量中的NumericValidator的实例传递给某个函数时,才使用Singleton而不是静态类。
  2. 在PHP 5.3,你可以得到静态类的实例:

    类测试 { 公共静态函数实例(){ 打印 'ZZ'; }}

    $ Z =新的考验; $ z-> instance();

  3. 不要在意在PHP并发请求,它是单线程的,每个进程执行自己的代码。

+0

我不会使用第1点作为使用单身人士的理由。单例的目的是保持对共享实例的属性的访问。不是关于你是否将引用传递给另一个函数。 – Wes 2011-04-15 21:00:13

+0

我正在谈论单身和静态类之间的差异,而不仅仅是单身。 – 2011-04-15 21:11:22

+0

那么你从“使用...”开始,这是我的参考点。 to之间的不同之处在于传统上静态类无法实例化,但PHP 5.3完全否定了这一点。 – Wes 2011-04-15 21:16:09