Как избежать синглтона при вызове объекта внутри глобальной функции? - PullRequest
2 голосов
/ 01 декабря 2011

Я построил следующую функцию i18n, которая вызывается несколько раз при рендеринге вида:

function e_($text)
{
    $t = Translate::Instance(); 
    vprintf($t->_($text), array_slice(func_get_args(), 1)); // outputs translated text
}

В настоящее время я получаю экземпляр Singleton-класса Translate внутри функции.

Я читал, что вместо этого следует использовать внедрение зависимостей.
Но если я использую внедрение зависимостей, мне придется каждый раз передавать объект Translate в функцию, верно?

Это стало бы:

<?php e_('my text', $this->Translate); а не просто <?php e_('my text'); ?>

Ну, я бы хотел этого избежать.

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

То, как вы используете функцию e_, фактически использует псевдоним. Это хорошо, если вы можете жить с этим. Вам не нужно использовать синглтон для реализации псевдонима:

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

При настройке слоя вида установите зависимость:

$GLOBALS['e_alias'] = $translate;

В контексте приложения установите глобальную переменную $translate. Это позволит вам отойти от одиночки (которые являются лжецами), и вам на самом деле нужна только глобальная переменная.

Кроме того, он позволяет тестировать представления с псевдонимом e_ для разных реализаций перевода.

Недостатком является то, что вам нужно управлять списком всех этих специальных глобальных переменных, как вы должны поддерживать для глобальных функций, таких как e_.

См. Также этот ответ на Получение $this внутренней функции вопрос.

0 голосов
/ 01 декабря 2011

True. Причина, по которой вы бы использовали вместо этого внедрение зависимостей, заключается в том, что вы можете поменять метод перевода для любого конкретного использования e_().

В данном конкретном случае я не уверен, что это того стоит, если вы не хотите тестировать различные методы перевода во время тестирования.

Одна вещь, которую вы могли бы сделать, чтобы немного помочь с производительностью, - сделать $t статическим, чтобы Translate::Instance() вызывался только один раз, независимо от того, сколько вызовов e_() сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...