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

时间:2011-12-01 18:12:49

标签: php oop design-patterns

我构建了一些以下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'); ?>

好吧,我想避免这种情况。

2 个答案:

答案 0 :(得分:1)

使用e_函数的方式实际上是使用别名。只要你能忍受它就没关系。您不需要使用单例来实现别名:

function e_($text)
{
    return $GLOBALS['e_alias']->alias(func_get_args());
}

设置视图图层时,请设置依赖关系:

$GLOBALS['e_alias'] = $translate;

在应用程序上下文中,设置全局变量$translate。这将允许你离开单身人士(这是骗子),你实际上只需要一个全局变量。

此外,它允许您使用针对不同翻译实现的e_别名测试视图。

缺点是您需要管理所有这些特殊全局变量的列表,就像您需要为e_等全局函数维护一样。

请参阅this answer问题的Getting $this inside function

答案 1 :(得分:0)

真。您将使用依赖注入的原因是,您可以替换e_()的任何特定用途的翻译方法。

在这种特殊情况下,除非您希望在测试期间测试不同的翻译方法,否则我不确定它是否值得。

你可以采取一些措施来提高性能,使$t保持静态,这样无论拨打Translate::Instance()多少次,e_()都只会被调用一次。