我构建了一些以下i18n函数,在渲染视图时多次调用它:
function e_($text)
{
$t = Translate::Instance();
vprintf($t->_($text), array_slice(func_get_args(), 1)); // outputs translated text
}
目前,我在函数内部获得了Translate单例类的实例。
我已经读过应该使用依赖注入 但是如果我使用依赖注入,我每次都必须将Translate对象传递给函数,对吧?
这将成为:
<?php e_('my text', $this->Translate);
而不仅仅是<?php e_('my text'); ?>
好吧,我想避免这种情况。
答案 0 :(得分:1)
使用e_
函数的方式实际上是使用别名。只要你能忍受它就没关系。您不需要使用单例来实现别名:
function e_($text)
{
return $GLOBALS['e_alias']->alias(func_get_args());
}
设置视图图层时,请设置依赖关系:
$GLOBALS['e_alias'] = $translate;
在应用程序上下文中,设置全局变量$translate
。这将允许你离开单身人士(这是骗子),你实际上只需要一个全局变量。
此外,它允许您使用针对不同翻译实现的e_
别名测试视图。
缺点是您需要管理所有这些特殊全局变量的列表,就像您需要为e_
等全局函数维护一样。
答案 1 :(得分:0)
真。您将使用依赖注入的原因是,您可以替换e_()
的任何特定用途的翻译方法。
在这种特殊情况下,除非您希望在测试期间测试不同的翻译方法,否则我不确定它是否值得。
你可以采取一些措施来提高性能,使$t
保持静态,这样无论拨打Translate::Instance()
多少次,e_()
都只会被调用一次。