Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 实例方法中的静态实例数组_Php_Oop_Cakephp - Fatal编程技术网

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();