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
是数组而不是普通对象的原因。
使用单项数组存储类实例的目的是什么?
答案 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();
按引用分配不适用于static
,the 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
数组值。