Динамические статические переменные в классе. Миф или реальность?

7 Авг
2012

Итак, стоит задача написать класс со статическими переменными, которые будут доступны в любой части приложения посредству, к примеру, app::test. Но есть одна проблема — переменные данного класса должны на лету создаваться при чтении с файла или базы.

Решение проблемы под блогакатом.

Опишем задачу немного детальнее. Класс ‘lang’, является «языком» приложения, который загружает с файла массив со словами, которые в дальнейшем используем в приложении.

Упрощенный код файла lang.php, без проверок и других методов.

final class lang {

  private static $words;
    
  private static function set($key, $value) {
    self::$words->$key = $value;
  }
  public static function __callStatic($method, $agrs) {
    echo self::$words->$method;
  }
  public static function loadLanguage() {
    require_once 'ru.php';
    foreach($language as $key=>$value) {
      self::set($key, $value);
    }
  }
}


Запускаем метод lang::loadLanguage(), который для каждого элемента загруженного массива $language вызывает приватный метод set(). В свою очередь set() устанавливает в $words (экземпляр класса stdClass) все переменные динамически.

И теперь начинается все волшебство, которое дают магические методы в php.

метод __callStatic появился в php 5.3 и очень поможет в решении нашей задачи! Конечно, самым лучшим вариантом было бы __getStatic, но его, к сожалению, нету.

Магический метод __callStatic сработает тогда, когда будет вызван несуществующий метод (имитируем вызов переменной) подобным образом: lang::enter_button();
Естественно метод enter_button() не существует в классе lang и сработает перегрузка, которая будет выводить переменную с $words.

Теперь в любом View приложения можно использовать данный класс, не создавая дополнительных объектов и упростив себе жизнь очень коротким выводом требуемого слова.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх