Php 单身有多糟糕?
所以 很明显,有很多问题都被问到了关于单例、全局状态变量以及所有这些伟大的东西。我的问题是, 如果单例和全局都很糟糕,为什么会经常使用它们? 下面的例子只是我头脑中的一些例子,我相信很多人都在使用这些例子 我给你一个来自CodeIgniter的函数,它使用一个psuedo单例函数: (system\codeigniter\Common.php第89行) 通过将每个对象放在单个注册表中,您不能使用它们的load_类函数创建任何对象的多个实例。当您想将类用作数据结构时,这尤其不方便 此外,由于所有这些类只有一个实例,因此导致了反对全局状态的争论。这让我想到 整个Wordpress系统,主要运行在全局变量上。所有通过帖子进行循环的数据都散布在各种全球网站上 (wp包括\query.php第2644行) 这只是两个主要的框架示例,它们使用单例/全局函数作为整个系统的基础 所以。。这仅仅是因为这些系统没有赶上OOP方法学吗?当你有这么多人告诉你不要使用全局变量或单例,让你的整个系统基于上述实践时,这是没有意义的Php 单身有多糟糕?,php,oop,wordpress,codeigniter,Php,Oop,Wordpress,Codeigniter,所以 很明显,有很多问题都被问到了关于单例、全局状态变量以及所有这些伟大的东西。我的问题是, 如果单例和全局都很糟糕,为什么会经常使用它们? 下面的例子只是我头脑中的一些例子,我相信很多人都在使用这些例子 我给你一个来自CodeIgniter的函数,它使用一个psuedo单例函数: (system\codeigniter\Common.php第89行) 通过将每个对象放在单个注册表中,您不能使用它们的load_类函数创建任何对象的多个实例。当您想将类用作数据结构时,这尤其不方便 此外,由于所有这
当然,关于PHP4的向后兼容性存在争议。我仍然认为在PHP4中有一些方法可以进行OOP编程,因为类仍然可用 人们不鼓励使用全局变量,因为它增加了bug的可能性。如果程序中的每个函数都访问相同的全局变量,那么在某个地方出错就容易多了,而且调试也难多了。它也更难测试
我想它们仍然经常被使用,因为程序员很懒。我们不想花时间预先把代码整理得井井有条、漂亮,我们只想把工作做好。只编写一个全局函数/变量/任何东西都比模块化容易得多,一旦你开始沿着这条路走下去,回头重构就太痛苦了。也许这就是原因:他们就是这样开始的,从来没有回头过。可能是因为GoF的设计模式书。它变得太普遍了,人们认为它是绝对正确的。基于PHP4的应用程序(如WP或CI)中的原因部分是由于PHP4对OOP结构的支持较差 Globals和singleton也很简单:在global中使用某些东西所需的思考要比使用适当的OOP实践来构建它少得多。访问它们也更简单,只需将代码指向名称即可,而无需从其他地方传入对象 全局状态(全局变量、单例等)的一个负面影响是它使单元测试变得更加困难
根据我的经验,wordpress的代码质量一般都很差。我不会用它来衡量任何东西……因为使用单例相对容易,而不使用它则需要对应用程序的结构进行更详细的规划。不久前我问了一个问题,得到了有趣的答案 如果单身和通婚都很糟糕, 为什么它们经常被使用 我认为它的要点是单身使事情变得容易。至少乍一看是这样。我在这件事上没有足够的经验说些更有用的话,但我发现以下是一本很好的读物:
在清洁过程中,一个单身汉代表着将污垢隐藏在黑暗角落而不是清洁 它之所以被广泛使用,是因为它能很好地隐藏问题 对那些想打扫但又不想打扫的人来说,这是件好事 这对那些真正想清理东西的人来说是件坏事 考虑依赖注入 如果一个单身汉引起了一个你无法隐藏的问题
我得到了全局变量的概念。我的问题是,为什么在流行的系统中使用了这么多。我想他不是在问为什么单身不好,而是为什么他们总是被高调的项目所使用。我想我在第二段中提到过,不是吗?现在你问到了。以前只有第一段的一部分。这里也一样:)我的原始答案几乎从未接近最终结果。在某些情况下,使用全局变量或单例可以更方便地重用资源以提高效率。例如,在脚本的整个生命周期内保持单个全局数据库连接。然而,在看过WordPress的一些代码后,它在某些地方自由地使用全局变量,对调用函数的上下文做了广泛的假设,这只是一种无知的设计。我只是指出WordPress被许多人使用,很多人。你的问题假设这些项目是如何做事的好例子。Wordpress是如何不构建PHP应用程序的一个巨大示例。。。它的代码库很糟糕。我没有足够的评论空间来表达Wordpress的编程有多么糟糕。至于CodeIgniter,为了实现与PHP4的向后兼容性,他们牺牲了很多清洁度和可读性。当然,你的问题仍然非常有效,因为许多其他项目确实使用全局和单例
/**
* 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];
}
.......
}
/**
* 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);
....
}