Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP单例类的最佳实践_Php_Oop_Class_Design Patterns_Singleton - Fatal编程技术网

PHP单例类的最佳实践

PHP单例类的最佳实践,php,oop,class,design-patterns,singleton,Php,Oop,Class,Design Patterns,Singleton,可能重复: 我总是写关于最佳实践的文章,但我也想理解为什么给定的东西是最佳实践 我在一篇文章中读到(不幸的是,我不记得了)单例类更倾向于实例化,而不是使用静态函数创建并使用范围解析操作符(:)访问。因此,如果我有一个包含所有要验证的工具的类,简而言之: class validate { private function __construct(){} public static function email($input){ return true; }

可能重复:

我总是写关于最佳实践的文章,但我也想理解为什么给定的东西是最佳实践

我在一篇文章中读到(不幸的是,我不记得了)单例类更倾向于实例化,而不是使用静态函数创建并使用范围解析操作符(:)访问。因此,如果我有一个包含所有要验证的工具的类,简而言之:

class validate {
    private function __construct(){}
    public static function email($input){
        return true;
    }
}
有人告诉我,这被认为是一种不好的做法(或者至少被警告不要),因为垃圾收集器和维护之类的事情。所以,对“作为静态方法的单例类”的批评想要的是,我实例化一个类,我100%确定我只会实例化一次。对我来说,这就像是在做“双重工作”,因为一切都准备好了。我错过了什么


对这件事有什么看法?当然这不是一个生死攸关的问题,但如果有选择的话,我们不妨用正确的方式做一件事:)

好吧,这实际上不是单身;singleton确保您只有一个类的单个实例,并且这里没有检索Validate的单个实例的方法。这里的设计似乎是一个静态类。这不会导致垃圾收集器出现问题(至少是您在此处放置的代码),因为无论发生什么情况,垃圾收集器都会加载到内存中。

php中的单例类示例:

Singleton被认为是“坏习惯”。

主要原因是:

想读更多吗

单例决策图():


单例对象是只实例化一次的对象。这与不同,这是一种(反)模式,如何编写只能实例化一次的类,Singleton(开始时为大S):

确保类只有一个实例,并提供对它的全局访问点

就PHP而言,通常不需要实现单例模式。事实上,当你要求最佳实践时,你应该避免这样做,因为这是不好的实践

此外,您发现的大多数PHP代码示例都是该模式的半成品实现,忽略了PHP的工作方式。这些伪实现不符合模式中的“确保”

这也说明了一些事情:通常情况下,它是不需要的。如果一个草率的实现已经完成了工作,但还没有接近模式的用途,那么在这种情况下使用了错误的模式,它就开始成为一种反模式

在PHP中,通常不需要不惜一切代价确保一个类只有一个实例,PHP应用程序没有您需要的那么复杂(例如,没有多个线程可能需要引用原子实例)

通常剩下的是类实例的全局访问点,这是大多数PHP开发人员(mis)使用的模式。正如今天所知,使用这样的“单例”会导致全局静态的标准问题,这会在多个级别上给代码带来复杂性,并降低可重用性。作为一名程序员,你失去了灵活使用代码的能力。但柔性是解决问题的一项非常重要的技术。程序员整天都在解决问题

因此,在应用设计模式之前,需要评估利弊。经常使用一些模式是没有帮助的


对于初学者,我想说的是,只需编写您的类,并注意如何以及何时在应用程序逻辑的其他部分实例化它们,以便保持灵活性。

感谢链接;已经在读了。MarkHünermundJensen在阅读你的问题时认为,我可能误解了什么是单身(这在下面的回答中指出)。Tats为什么发布链接;)。请注意,依赖项注入并不等于依赖项注入容器。DI绝对是一件好事;DIC是实现这一点的一种方法,不一定是一种一刀切的解决方案(尽管目前它在PHP世界中非常“流行”)。服务定位器或类似模式也可能是一种可以接受的打破依赖关系的方法。鉴于本文仅收集SO和外部站点的链接,我认为它应该是一个社区Wiki。@gordon Community Wiki done:)。这当然可以解释为什么我找不到逻辑,因为这种类型的类将是一个问题。所以单例并不是一个只实例化一次的类,而是一个只调用一次的方法?第一个短语的可能重复是矛盾的:)-1.另外-1表示“PHP应用程序没有那么复杂”。您可以使用任何语言编写复杂的软件。设计模式与软件架构相关,而不是与底层技术相关。我会投三倍的反对票,但我不能。:)@我这样写的一个原因是PHP应用程序通常不需要跨进程和线程的原子性,这是更复杂软件中线程安全单例的一个用例。你可能判断得太快,因为你认为这确实攻击了某些特定的语言,但事实并非如此。只是普通PHP代码不需要实现该模式。如果你还需要它,我甚至在我的博客上提供了这种模式。