Класс PHP Translator - Мнения о лучшей практике

1

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

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

Это пример класса транслятора.

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
    Ничто не должно расширять класс Translator, если это не Translator. Нечто под названием «Переводчик» не должно расширять приложение.
  • 1
    Узнайте о композиции объектов.
Показать ещё 9 комментариев
Теги:
oop
global-variables
extends
global

1 ответ

0
Лучший ответ

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

Я узнал, что статические классы еще проще в использовании. В принципе, вам не нужно получать экземпляр переводчика, когда он вам нужен, вы можете использовать его на протяжении всего приложения, используя статический класс. Я думал, что проблема с производительностью связана с использованием статических классов, но, видимо, это не относится к новым выпускам 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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню