oop — PHP Translator class — Мнения о лучшей практике

Я делаю свою собственную структуру и у меня есть класс переводчика, который используется в нескольких местах по всему приложению.

Меня беспокоит то, что в классе переводчика есть конструктор, который включает в себя все необходимые файлы для перевода, что означает, что каждый объект, имеющий переводчик, включает эти файлы, возможно, несколько раз.

Это пример класса переводчика.

class Translator{
protected $translations;

public function __construct(){
$this->translations[] = include $this->language . ".php"; //General texts for a language
$this->translations[] = include $this->language . "-" . $this->controller . ".php"; //General texts for a controller
$this->translations[] = include $this->language . "-" . $this->controller . "-" . $this->action . ".php"; //Specific texts for an action
}

public function translate($key){
return $this->translations[$key];
}

}

Это было бы как сделать это путем расширения. После прочтения о композиции объектов, этот способ, кажется, сильно не рекомендуется. Увидеть http://www.cs.utah.edu/~germain/PPS/Topics/oop.html

class View extends Translator{
...
}

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

class View{
protected $translator;

public function __construct(){
$this->translator = new Translator();
}

...
}

Вместо того, чтобы создавать новый переводчик, как насчет того, чтобы вставить его в глобальную переменную?

$translator = new Translator();

class View{
protected $translator;

public function __construct(){
global $translator
$this->translator = $translator;
}

...
}

Последняя идея, с публичными функциями вместо класса

$translations = //Include the language array files like in the translator class

function translate($key){
global $translations;
return $translations[$key];
}

1

Решение

РЕДАКТИРОВАТЬ

Я обнаружил, что статические классы еще проще в использовании. По сути, вам не нужно получать экземпляр переводчика, когда он вам нужен, вы можете использовать его во всем приложении, используя статический класс. Я думал, что есть проблема с использованием статических классов, но, очевидно, это не относится к новым версиям PHP.

Проверьте это, чтобы получить представление о том, как создавать и использовать статические классы:
Можно ли создавать статические классы в PHP (как в C #)?

OLD

Как упоминал Джон, метод, который я выбрал в итоге, был одноязычным классом для переводчика. По сути, экземпляр транслятора создается только один раз, и везде, где запрашивается, экземпляр транслятора получает один и тот же экземпляр. Убедитесь, что вы узнали о недостатках такого метода, прежде чем использовать его.

Вот хороший пример того, как это сделать
Создание шаблона проектирования Singleton в PHP5

Быстрое демо

final class Translator{
protected $translations;

public static function getInstance(){
static $inst = null;
if ($inst === null){
$inst = new Translator();
}
return $inst;
}

private function __construct(){ //Private constructor so nobody else can instance it
...//Look at translator class in question
}
}

Чтобы получить экземпляр переводчика, позвоните туда, где вам это нужно.

$translator = Transaltor::getInstance();
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector