【发布时间】:2011-01-01 01:26:21
【问题描述】:
所以....
显然有很多关于单例、全局状态变量和所有很棒的东西的问题。我的问题是,
如果 Singletons 和 Globals 如此糟糕,为什么会如此频繁地使用它们?
以下示例只是我脑海中浮现的示例,我认为它们已被很多人使用。
我给你一个来自 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);
....
}
这些只是使用 Singleton/Globals 作为整个系统基础的框架的两个主要示例!
那么 .. 仅仅是因为这些系统没有赶上 OOP 方法吗?当你有这么多人告诉你不要使用全局变量或单例来让你的整个系统基于上述做法时,这是没有意义的。
当然还有关于向后兼容 PHP4 的争论。我仍然认为有一些方法可以在 PHP4 中进行 OOP 编程,因为类仍然可用。
【问题讨论】:
-
您的问题假设这些项目是如何做事的好例子。 Wordpress 是如何不 构建 PHP 应用程序的一个巨大示例……它的代码库很糟糕。我没有足够的评论空间来表达 Wordpress 的编程有多糟糕。至于 CodeIgniter,为了实现与 PHP 4 的向后兼容性,他们牺牲了很多清洁度和可读性。当然,您的问题仍然完全有效,因为许多其他项目确实使用全局和单例。
-
WP = 很棒的应用程序,但是组织得很差,而且写得也很差。可悲的是 WP 仍在使用 PHP4 标准。在这一点上,我很期待 PHP 5.4 的特性之类的!
标签: php oop wordpress codeigniter