实例方法中的静态实例数组

时间:2014-04-05 14:53:35

标签: php oop cakephp

I18n class in CakePHP提供此方法来创建实例:

public static function getInstance() {
    static $instance = array();
    if (!$instance) {
        $instance[0] = new I18n();
    }
    return $instance[0];
}

除其他注意事项外(如果我错了,请纠正我),我理解使用convenience functions中的类实例会有所帮助:

/**
 * Returns a translated string if one is found; Otherwise, the submitted message.
 */
function __($singular, $args = null) {
    // ...
    $translated = I18n::translate($singular);
    // ...
}
echo __('Hello, World!');

这看起来比必须将实例作为参数传递更清晰(或者更糟糕的是,使用随机命名的全局变量)。但我无法想象$instance是数组而不是普通对象的原因。

使用单项数组存储类实例的目的是什么?

2 个答案:

答案 0 :(得分:1)

我怀疑这是旧PHP4 / CakePHP版本的遗留物,其中实例是通过引用分配的。

<强> https://github.com/cakephp/cakephp/blob/1.2.0/cake/libs/i18n.php

function &getInstance() {
    static $instance = array();
    if (!$instance) {
        $instance[0] =& new I18n();
        $instance[0]->l10n =& new L10n();
    }
    return $instance[0];
}
$_this =& I18n::getInstance();

按引用分配不适用于staticthe reference is not being remembered,而是it works when assigned to an array entry

所以这很可能只是PHP限制的一种解决方法。

答案 1 :(得分:0)

一个可能的原因是将所有singleton类实例保留在一个全局中 - (static 是本例的全局同义词)数组变量用于监视或不要使用每个单例的单个变量来破坏全局/本地命名空间。如果每个static变量都具有随机名称,例如$translated,那么覆盖它的价值会更容易。 - 再次对我来说,这是非常可能的后方。

例如,I18Nn实例将使用[0]键,其他类将具有其他键。您应该检查singleton类,如何管理static $instance数组值。