Я делаю свою собственную структуру и у меня есть класс переводчика, который используется в нескольких местах по всему приложению.
Меня беспокоит то, что в классе переводчика есть конструктор, который включает в себя все необходимые файлы для перевода, что означает, что каждый объект, имеющий переводчик, включает эти файлы, возможно, несколько раз.
Это пример класса переводчика.
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];
}
РЕДАКТИРОВАТЬ
Я обнаружил, что статические классы еще проще в использовании. По сути, вам не нужно получать экземпляр переводчика, когда он вам нужен, вы можете использовать его во всем приложении, используя статический класс. Я думал, что есть проблема с использованием статических классов, но, очевидно, это не относится к новым версиям 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();
Других решений пока нет …