Pure Static Class vs Singleton

时间:2011-04-15 20:41:06

标签: php design-patterns

编写一个PHP应用程序,并且有几个的类具有静态方法(不需要实例方法)。一个示例是NumericValidator,其中包含checkInteger($toCheck)等方法,用于检查以确保传递的参数为int类型,checkGreaterThan($lOperand, $rOperand)确保左操作数为大于右操作数等。

我知道我可以将这些方法中的每一个都放入PHP文件而不将它们放在类中,但是我想在这里采用OOP方法,以防API发展为需要实例化{ {1}}。

但它确实提出了一个问题:100%静态方法的类如何与一个类实现单例设计模式有什么不同,其中整个代码库中使用的每个引用都调用相同的实例?

例如,以下是我的代码现在的样子:

NumericValidator

但我可以将所有public function doSomething($p_iNum) { if(!NumericValidator::checkInteger($p_iNum)) // throw IllegalArgumentException // ... } 的静态方法转换为非静态实例方法,迫使程序员实例化它,然后实现单例设计模式,这样你才能永远参考它的一个实例:

NumericValidator

最后,我的问题:哪个更好,更符合最佳做法?是否有性能方面的考虑?这两种方法如何影响并发或来自多个用户的请求?

2 个答案:

答案 0 :(得分:1)

我会在你的例子中使用静态类。我将使用的区别是,如果您尝试在访问中保留实例的任何属性状态。这就是单身人士的设计目标。静态类提供对命名空间中方法的有组织的访问,这有助于清晰地显示代码,但它没有任何关于自身的属性。

所以是的,你可以使用单例,但它会是糟糕的形式,因为你没有想要在页面访问中提供的实例属性。

希望这有帮助。

答案 1 :(得分:0)

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

    班级考试 {     公共静态函数实例()     {         打印' zz&#39 ;;     } }

    $ z =新测试; $ Z->实例();

  3. 不关心PHP中的并发请求,它是单线程的,每个进程都执行自己的代码。