纯静态类vs单例

问题描述

| 编写一个PHP应用程序,并拥有几个仅具有静态方法的类(不需要实例方法)。一个示例是
NumericValidator
,它具有类似
checkInteger($tocheck)
这样的方法来检查以确保您传递的参数的类型为int,而
checkGreaterThan($lOperand,$rOperand)
可以确保左操作数大于右操作数,等等。 我知道我可以将这些方法中的每一个都放入一个PHP文件中,而无需将它们放入类中,但是我想在这里采用一种OOP方法,以防API演变为需要实例化“ 0”。 但这确实引出了一个问题:具有100%静态方法的类与实现一个单例设计模式的类有什么不同,在该模式中,整个代码库中使用的每个引用都调用同一实例? 例如,这是我的代码现在的样子:
public function doSomething($p_iNum)
{
    if(!NumericValidator::checkInteger($p_iNum))
        // throw IllegalArgumentException

    // ...
}
但是我可以将ѭ0的所有静态方法转换为非静态实例方法,迫使程序员实例化它,然后实现单例设计模式,因此您只能引用它的1个实例:
public function doSomething($p_iNum)
{
    NumericValidator $nv = NumericValidator::getInstance();

    if(!nv->checkInteger($p_iNum))
        // throw IllegalArgumentException

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

解决方法

我将在您的示例中使用静态类。我要使用的区别是,如果您试图跨访问保留实例的属性的任何状态。这就是单例设计的目的。静态类为命名空间中的方法提供了有组织的访问权限,这有助于使代码清晰,但它本身不具有任何属性。 是的,您可以使用单例,但是这将是一种不好的形式,因为没有要跨页面访问使用的实例属性。 希望这可以帮助。     ,仅当您要将变量中的NumericValidator实例传递给某个函数时,才使用Singleton代替静态类。 在PHP 5.3中,您可以获取静态类的实例: 课堂测试 {     公共静态函数instance()     {         打印\'zz \';     } } $ z =新测试; $ z-> instance(); 不在乎PHP中的并发请求,它是单线程的,每个进程都执行自己的代码。