问题描述
|
编写一个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中的并发请求,它是单线程的,每个进程都执行自己的代码。