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