在全局函数中调用对象时避免单例的方法


Ways to avoid singleton when calling a object inside a global function?

我构建了一些下面的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()只被调用一次。