php - 单例有多糟糕?

标签 php oop wordpress codeigniter

所以....

很明显,关于单例、全局状态变量以及所有这些很棒的东西,人们都问过很多问题。我的问题是,

如果单例和全局如此糟糕,为什么它们被如此频繁地使用?

以下示例只是我脑海中浮现的示例,我相信很多人都在使用它们。

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

(系统\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);
    ....
}

这些只是使用单例/全局作为整个系统基础的框架的两个主要示例!

那么 .. 仅仅是因为这些系统没有跟上 OOP 方法论的步伐吗?当有这么多人告诉您不要使用全局变量或单例,让您的整个系统都基于上述做法时,这就没有意义了。

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

最佳答案

因为使用单例相对容易,而在没有单例的情况下工作需要对应用程序的结构进行更详细的规划。我问了一个question about alternatives前段时间,得到了有趣的答案。

关于php - 单例有多糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1996230/

相关文章:

oop - 为什么面向对象的语言在嵌入式世界中不流行?

wordpress - 将社交网络集成到 wordpress 原生评论中

Jquery window.send_to_editor

php - 根据 WooCommerce 中的产品或类别隐藏特定运输选项

php - 通过 PHP 将字段插入 MySQL 数据库不起作用

java - 模板模式,但其中一个类未实现该方法

php - 使用 PHP 在后台运行管道 shell 命令

perl - 如何以 `can`看不到的方式隐藏基类中的方法?

PHP:以等号作为参数的函数?

php - 我的 MYSQL 注入(inject)语句是否容易受到攻击?