Създавам своя собствена рамка и имам клас преводач, който се използва на няколко места в приложението.
Притеснението ми е, че класът на преводач има конструктор, който включва всички необходими файлове за превод, което означава, че всеки обект, който има преводач, включва тези файлове вероятно многократно.
Това е пример за класа преводач.
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];
}