Я создаю свою собственную структуру и имею класс переводчика, который используется в нескольких местах приложения.
Меня беспокоит то, что у класса переводчика есть конструктор, который включает все необходимые файлы для перевода, а это означает, что каждый объект, у которого есть переводчик, включает эти файлы, возможно, несколько раз.
Это пример класса переводчика.
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, как насчет того, чтобы вставить его в глобальную переменную?
$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];
}