所以......
显然,很多问题都是关于单身人士,全球状态变量以及所有伟大的东西。我的问题是,
如果Singletons和Globals如此糟糕,为什么经常使用它们?
下面的例子很简单,我相信很多人都会使用这些例子。
我从CodeIgniter给你一个使用伪单例函数的函数:
(system \ codeigniter \ Common.php第89行)
/**
* Class registry
*
* This function acts as a singleton. If the requested class does not
* exist it is instantiated and set to a static variable. If it has
* previously been instantiated the variable is returned.
*
* ......
*/
function &load_class($class, $instantiate = TRUE)
{
static $objects = array();
// Does the class exist? If so, we're done...
if (isset($objects[$class]))
{
return $objects[$class];
}
.......
}
通过将每个对象放入单个注册表中,您无法使用其load_class函数来创建任何内容的多个实例。当您想要将类用作数据结构时,这尤其不方便。
此外,因为所有这些类只有一个实例,所以它会导致反对全局状态的论点。这导致我......
整个Wordpress系统,主要运行全局变量。循环遍历帖子的所有数据都散布在各种全局变量中。
(wp-includes \ query.php第2644行)
/**
* Setup global post data.
*
*....
*/
function setup_postdata($post) {
global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;
$id = (int) $post->ID;
$authordata = get_userdata($post->post_author);
....
}
这些只是使用Singleton / Globals作为整个系统基础的框架的两个主要示例!
那么......是不是因为这些系统还没有赶上OOP方法?当你有这么多人告诉你不要使用全局变量或单身人士来制作你的整个系统时,这是没有意义的。
当然有关于向后兼容PHP4的争论。我仍然认为有很多方法可以在PHP4中进行OOP编程,因为类仍然可用。
答案 0 :(得分:9)
因为与单身人士一起工作相对容易,而且在没有单人工作的情况下进行更详细的应用程序结构规划。我前段时间问question about alternatives,得到了有趣的答案。
答案 1 :(得分:4)
人们不鼓励使用全局变量,因为它增加了bug的可能性。如果程序中的每个函数都访问相同的全局变量,那么在某处犯错是很容易的,并且调试起来要困难得多。这也很难测试。
我想他们仍然经常使用,因为程序员很懒惰。我们不想花时间预先让代码整齐有序,我们只想完成工作。编写一个全局函数/变量/而不是模块化它要容易得多,一旦你开始沿着这条路走下去,那么返回并重构就会非常痛苦。也许这就是原因:他们就是这样开始的,根本就没有回头。
答案 2 :(得分:3)
可能是因为GoF的设计模式书。它变得过于普遍,人们将其视为绝对可靠。
答案 3 :(得分:3)
基于PHP4的应用程序(如WP或CI)的原因部分归因于PHP4对OOP结构的更糟支持。
全局和单身人士也很简单:在全球范围内打击某些东西比用适当的OOP实践构建它要少得多。访问它们也更简单,只需将代码指向名称即可,而不需要从其他地方传递对象。
全局状态(全局变量,单例等)的一个负面影响是它使单元测试变得更加困难。
ps:根据我的经验,wordpress通常具有相当差的代码质量。我不会将它用作任何事物的衡量标准......
答案 4 :(得分:2)
如果Singletons和Globals如此糟糕, 为什么经常使用它们?
我认为它的要点是单身人士让事情变得简单。至少乍一看。我没有足够的经验来说出更有用的东西,但是我发现以下内容很好:
答案 5 :(得分:2)
答案 6 :(得分:1)
在清洁过程中,单身人士会将污垢隐藏在黑暗的角落而不是清洁。
它的使用非常广泛,因为它可以很好地隐藏问题。
对于那些要清洁但又不想做的人来说,这是一件好事。
对于那些真正想要清洁东西的人来说,这是一件坏事。
考虑依赖注入http://martinfowler.com/articles/injection.html 如果Singleton导致问题,你就不能再隐藏了。