Php 单身有多糟糕?

Php 单身有多糟糕?,php,oop,wordpress,codeigniter,Php,Oop,Wordpress,Codeigniter,所以 很明显,有很多问题都被问到了关于单例、全局状态变量以及所有这些伟大的东西。我的问题是, 如果单例和全局都很糟糕,为什么会经常使用它们? 下面的例子只是我头脑中的一些例子,我相信很多人都在使用这些例子 我给你一个来自CodeIgniter的函数,它使用一个psuedo单例函数: (system\codeigniter\Common.php第89行) 通过将每个对象放在单个注册表中,您不能使用它们的load_类函数创建任何对象的多个实例。当您想将类用作数据结构时,这尤其不方便 此外,由于所有这

所以

很明显,有很多问题都被问到了关于单例、全局状态变量以及所有这些伟大的东西。我的问题是,

如果单例和全局都很糟糕,为什么会经常使用它们?

下面的例子只是我头脑中的一些例子,我相信很多人都在使用这些例子

我给你一个来自CodeIgniter的函数,它使用一个psuedo单例函数:

(system\codeigniter\Common.php第89行)

通过将每个对象放在单个注册表中,您不能使用它们的load_类函数创建任何对象的多个实例。当您想将类用作数据结构时,这尤其不方便

此外,由于所有这些类只有一个实例,因此导致了反对全局状态的争论。这让我想到

整个Wordpress系统,主要运行在全局变量上。所有通过帖子进行循环的数据都散布在各种全球网站上

(wp包括\query.php第2644行)

这只是两个主要的框架示例,它们使用单例/全局函数作为整个系统的基础

所以。。这仅仅是因为这些系统没有赶上OOP方法学吗?当你有这么多人告诉你不要使用全局变量或单例,让你的整个系统基于上述实践时,这是没有意义的


当然,关于PHP4的向后兼容性存在争议。我仍然认为在PHP4中有一些方法可以进行OOP编程,因为类仍然可用

人们不鼓励使用全局变量,因为它增加了bug的可能性。如果程序中的每个函数都访问相同的全局变量,那么在某个地方出错就容易多了,而且调试也难多了。它也更难测试


我想它们仍然经常被使用,因为程序员很懒。我们不想花时间预先把代码整理得井井有条、漂亮,我们只想把工作做好。只编写一个全局函数/变量/任何东西都比模块化容易得多,一旦你开始沿着这条路走下去,回头重构就太痛苦了。也许这就是原因:他们就是这样开始的,从来没有回头过。

可能是因为GoF的设计模式书。它变得太普遍了,人们认为它是绝对正确的。

基于PHP4的应用程序(如WP或CI)中的原因部分是由于PHP4对OOP结构的支持较差

Globals和singleton也很简单:在global中使用某些东西所需的思考要比使用适当的OOP实践来构建它少得多。访问它们也更简单,只需将代码指向名称即可,而无需从其他地方传入对象

全局状态(全局变量、单例等)的一个负面影响是它使单元测试变得更加困难


根据我的经验,wordpress的代码质量一般都很差。我不会用它来衡量任何东西……

因为使用单例相对容易,而不使用它则需要对应用程序的结构进行更详细的规划。不久前我问了一个问题,得到了有趣的答案

如果单身和通婚都很糟糕, 为什么它们经常被使用

我认为它的要点是单身使事情变得容易。至少乍一看是这样。我在这件事上没有足够的经验说些更有用的话,但我发现以下是一本很好的读物:


在清洁过程中,一个单身汉代表着将污垢隐藏在黑暗角落而不是清洁

它之所以被广泛使用,是因为它能很好地隐藏问题

对那些想打扫但又不想打扫的人来说,这是件好事

这对那些真正想清理东西的人来说是件坏事

考虑依赖注入 如果一个单身汉引起了一个你无法隐藏的问题

  • 全局变量和单例之所以流行是因为它们简单方便
  • 依赖注入是唯一合理方便的全局事物的替代品,在PHP社区中仍然是相当未知的
  • PHP社区通常更喜欢简单的破解而不是合适的解决方案
  • 许多PHP开发人员对编程一无所知,对如何使程序正常工作知之甚少

  • 我得到了全局变量的概念。我的问题是,为什么在流行的系统中使用了这么多。我想他不是在问为什么单身不好,而是为什么他们总是被高调的项目所使用。我想我在第二段中提到过,不是吗?现在你问到了。以前只有第一段的一部分。这里也一样:)我的原始答案几乎从未接近最终结果。在某些情况下,使用全局变量或单例可以更方便地重用资源以提高效率。例如,在脚本的整个生命周期内保持单个全局数据库连接。然而,在看过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);
        ....
    }