Php 实例方法中的静态实例数组
提供此方法来创建实例:Php 实例方法中的静态实例数组,php,oop,cakephp,Php,Oop,Cakephp,提供此方法来创建实例: public static function getInstance() { static $instance = array(); if (!$instance) { $instance[0] = new I18n(); } return $instance[0]; } 在其他考虑因素中(如果我错了,请纠正我),我理解从以下方面使用类实例是有帮助的: 这看起来比必须将实例作为参数传递(或者更糟糕的是,使用随机命名的全局变
public static function getInstance() {
static $instance = array();
if (!$instance) {
$instance[0] = new I18n();
}
return $instance[0];
}
在其他考虑因素中(如果我错了,请纠正我),我理解从以下方面使用类实例是有帮助的:
这看起来比必须将实例作为参数传递(或者更糟糕的是,使用随机命名的全局变量)更简洁。但是我无法想象为什么$instance
是一个数组而不是一个普通对象
使用一项数组来存储类实例的目的是什么?这样做的一个可能原因是将所有的
单例类实例保存在一个全局中-(静态
在本例中是全局的同义词)数组变量,用于监视全局/本地命名空间是否与每个单例的单个变量混淆。如果每个静态
变量都带有随机名称,例如$translated
,则更容易覆盖和弄乱其值。-对我来说,这是极有可能的
例如,I18Nn
实例将具有[0]
键,其他类将具有其他键。您应该查看她的singleton
类如何管理静态$instance
数组值。我怀疑这是旧版本PHP4/CakePHP中通过引用分配实例的遗留问题
function &getInstance() {
static $instance = array();
if (!$instance) {
$instance[0] =& new I18n();
$instance[0]->l10n =& new L10n();
}
return $instance[0];
}
通过引用分配不适用于静态
,但是
因此,这很可能只是PHP限制的一种解决方法。我能想象的唯一目的是将实例数限制为1(假设重写以前的实例)。但是在这种情况下,不需要使用数组
。Singleton没有解释为什么$instance
是一个数组而不是一个普通对象,您可以使用普通对象来实现这一点。(您还需要将构造函数设置为私有/受保护。)是的,您可以通过普通的对象来实现这一点,但您需要为它指定一个唯一的名称,因为它意味着要被缓存(静态)。本例中使用的数组将包含所有此类对象。是否使用唯一的名称?$instance
有什么问题?如果只有$instance[0]
,为什么用复数形式说“所有这样的对象”?正如@ndm所解释的,我认为这只是遗留代码。
echo __('Hello, World!');
function &getInstance() {
static $instance = array();
if (!$instance) {
$instance[0] =& new I18n();
$instance[0]->l10n =& new L10n();
}
return $instance[0];
}
$_this =& I18n::getInstance();