ФорумПрограммированиеPHP для идиотов → статические методы там, где они нужны

статические методы там, где они нужны

  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 13:47

    как новичок узнает о синглтоне и пихает его везде, я хоть и давно знаю статические методы, но только недавно проперло их везде совать. Часто удобно сделать пару методов типа set/get статическими, чтобы иметь удобный доступ к ним из любого класса. Ну это хрен с ним, а вот тут я уже сомневаюсь как делать. 1 класс в двух вариациях для примера, скажите, какой подход правильнее?


    <?php
    abstract class Config {

    static private $_extension = 'php';

    static public function setExtension($ext) {
    self::$_extension = $ext;
    }

    static public function getExtension($ext) {
    return self::$_extension;
    }

    static public function get($name) {

    $arr = explode('.', $name);
    $lib = ucfirst(self::$_extension).'Config';

    return $lib::get(array_shift($arr), $arr);
    }

    static public function load($name) {
    $lib = ucfirst(self::$_extension).'Config';
    return $lib::load($name);
    }
    }
    ?>


    <?php
    abstract class Config {

    static protected $is_inited = false;
    static private $_extension = 'php';
    static provate $_obj;

    static public function setExtension($ext) {
    self::$_extension = $ext;
    }

    static public function getExtension($ext) {
    return self::$_extension;
    }

    static public function init() {

    if (self::$is_inited == true) return;

    $lib = ucfirst(self::$_extension).'Config';
    self::$_obj = new $lib;
    }

    static public function get($name) {

    $arr = explode('.', $name);
    $lib = self::$obj
    return $lib->get(array_shift($arr), $arr);
    }

    static public function load($name) {
    return self::$obj->load($name);
    }
    }


    разница в том, что в первом варианте мы не храним экземпляр класса, читающего конфиг, использовать удобно, удобно даже обратиться к классам, читающим конфиги напрямую через стат. методы, напр. YamlConfig::load()
    а во втором варианте храним экземпляр объекта, неудобство в том, что надо еще вызывать предварительно метод init(), либо делать ленивую инициализацию, запихав проверки в каждый из методов класса
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 13:54, спустя 7 минут 9 секунд

    на недочеты с $_obj $obj и provate не обращайте внимания))
  • rider-sx

    Сообщения: 2706 Репутация: N Группа: Адекваты

    Spritz 15 ноября 2010 г. 13:57, спустя 3 минуты 28 секунд

    класс конфига должен быть полюбому статикой, ибо может понадобится читать конфиги неизвестно откуда)) Не, можно каешн контейнеры передавать, но ну нах, привет фабьену :) ИМХО
    Спустя 57 сек.
    А, исчо можно через неймспэйсы захуячить :)
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 14:01, спустя 3 минуты 36 секунд

    класс конфига должен быть полюбому статикой, ибо может понадобится читать конфиги неизвестно откуда)) Не, можно каешн контейнеры передавать, но ну нах, привет фабьену :) ИМХО

    мне кажется тоже, что так лучше, но нигде не видел статических методов оберток над другими статическими методами другого класса :-)
    большой минус, что нельзя влепить интерфейс, тк статическим методам похуй.


    А, исчо можно через неймспэйсы захуячить :)

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

    Сообщения: 3242 Репутация: N Группа: Джедаи

    Spritz 15 ноября 2010 г. 14:27, спустя 25 минут 50 секунд

    Синглтоны (т.е. классы со статическим вызовом функций) не нужны вообще.

    класс конфига должен быть полюбому статикой

    это будет большой ошибкой
    не всё полезно, что в swap полезло
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 14:35, спустя 7 минут 54 секунды

    Синглтоны (т.е. классы со статическим вызовом функций) не нужны вообще.

    ну вообще-то нужны иногда.


    класс конфига должен быть полюбому статикой

    это будет большой ошибкой

    можно аргументы?
  • master

    Сообщения: 3242 Репутация: N Группа: Джедаи

    Spritz 15 ноября 2010 г. 14:46, спустя 11 минут 42 секунды

    можно аргументы?

    Синглтоны не вписываются в архитектуру IoC, зарекомендовавшего себя способа построения приложений.

    ну вообще-то нужны иногда

    можно аргументы?
    Спустя 277 сек.
    http://wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code&s=ioc
    http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection&s=ioc

    Вообще многие спотыкаются о синглтоны, и одна из причин тому - отсутствие серьёзных проектировочных задач. Т.е. пишется проект "привет, мир", потом ещё один, потом ещё, и для всех них хватает конфига на синглтоне и одного класса базы данных. Тесты не пишутся, миграции не нужны, разработчик один.
    Можно пойти двумя путями - написать например фреймворк самому, или взять готовый код и исследовать его. В любом случае нужно время.
    Спустя 56 сек.
    Кстати, разговоры о преимуществе в скорости статических вызовов перед динамическими - миф. Я проверял, динамические даже немного быстрее.
    не всё полезно, что в swap полезло
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 14:54, спустя 7 минут 59 секунд

    можно аргументы?


    ну, преимущества:

    1) избавляет от загромождения при передаче множества параметров в метода от класса к классу.
    2) улучшенная альтернатива глобальным переменным
    3) позволяет создать только единственный экземпляр объекта, что иногда важно при работа с базами данных

    ну это в принципе главные преимущества.

    минусы:

    1) затрудняет отслеживание связей внутри системы

    когда phpdude показал мне свою цмс, которая вдоль и поперек напичкана синглтонами, я охренел. не понятно, что где начинается, и где это заканчивается :-)

    ну а вообще, я паттерн синглтон в прямом смысле этого слова давно не использую
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 ноября 2010 г. 14:56, спустя 1 минуту 57 секунд

    3) позволяет создать только единственный экземпляр объекта, что иногда важно при работа с базами данных

    просто у тебя задачи не стояли когда больше 1го конекта надо))) поверь, такое тоже бывает нужно, поэтому реализовывать бд обертку в виде статик класса - нехорошая идея :)
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 15 ноября 2010 г. 15:02, спустя 5 минут 24 секунды

    ну справедливости ради стоит вспомнить про мультитон

    Database::GetInstanse('read')->fetchAll('SELECT * FROM {users}');
    Спустя 16 сек.
    вот тебе и несколько коннектов
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 15:05, спустя 3 минуты 29 секунд


    3) позволяет создать только единственный экземпляр объекта, что иногда важно при работа с базами данных

    просто у тебя задачи не стояли когда больше 1го конекта надо))) поверь, такое тоже бывает нужно, поэтому реализовывать бд обертку в виде статик класса - нехорошая идея :)


    я же написал, что иногда важно. я в курсе о неск. соединений
    Спустя 111 сек.
    master, ты все-таки скажи конкретно по теме топика. в обоих вариантов классы внутренние используются динамически, так что управление зависимостями немного не в теме, ибо оно в обоих вариантах, либо я что-то недопонимаю.
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 15:16, спустя 11 минут 6 секунд

    в моем втором варианте мы имеем Service Locator

    в первом варианте класс PhpConfig, используемый классом Config легко можно расширить наследованием или же заменить, в моем фв, положив класс с таким же названием в /application/libs/, то есть не будет зависимостей
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 15 ноября 2010 г. 15:22, спустя 5 минут 19 секунд

    положив класс с таким же названием в /application/libs/

    коханоебство детектед
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 15 ноября 2010 г. 15:31, спустя 9 минут 36 секунд


    положив класс с таким же названием в /application/libs/

    коханоебство детектед


    это я узнал еще в ci
    Спустя 39 сек.
    я писал, что забодала такая архитектура, в начале реализую весь функционал фв, потом уже этим займусь
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 15 ноября 2010 г. 17:08, спустя 1 час 36 минут 22 секунды

    статика нужна тогда, когда ты точно знаешь зачем ты её пишешь, как будешь использовать, как она повлияет на гибкость, и как ты соотносишь действительность и летание в облаках..

Пожалуйста, авторизуйтесь, чтобы написать комментарий!