我构建了一些下面的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'); ?>
我想避免那样。
使用e_
函数的方式实际上是使用别名。只要你能接受就行。你不需要使用单例来实现别名:
function e_($text)
{
return $GLOBALS['e_alias']->alias(func_get_args());
}
设置视图层时,设置依赖项:
$GLOBALS['e_alias'] = $translate;
在应用上下文中,设置全局变量$translate
。这将允许您摆脱单例(这是骗子),实际上您只需要一个全局变量。
此外,它允许您使用e_
别名针对不同的翻译实现测试视图。
缺点是你需要管理所有这些特殊的全局变量的列表,就像你需要维护全局函数如e_
一样。
也可以看到这个关于获取$this
内部函数问题的答案。
True。使用依赖注入的原因是,您可以将翻译方法替换为e_()
的任何特定使用。
在这种特殊情况下,我不确定它是否值得,除非您希望在测试期间测试不同的翻译方法。
你可以做的一件事是使$t
静态,这样无论e_()
被调用多少次,Translate::Instance()
只被调用一次。