所以....
很明显,关于单例、全局状态变量以及所有这些很棒的东西,人们都问过很多问题。我的问题是,
如果单例和全局如此糟糕,为什么它们被如此频繁地使用?
以下示例只是我脑海中浮现的示例,我相信很多人都在使用它们。
我给你一个来自 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/