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

Статические методы и свойства

  • kendo

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

    Spritz 28 февраля 2008 г. 14:09

    Доброго времени суток, господа кодеры :)
    Хотелось бы узнать, когда, по вашему мнению, использование статических методов и свойств оправдано, а когда нет.
    Спрашиваю, ибо в литературе, которую я находил, приводилась теория, а вот о практическом использовании почти ничего не было сказано.
  • vasa_c

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

    Spritz 28 февраля 2008 г. 14:40, спустя 31 минуту 20 секунд

    Там где удобно оправдано, там где нет - не оправдано.
  • mechanic

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

    Spritz 28 февраля 2008 г. 14:50, спустя 9 минут 55 секунд

    если код в методе может работать сам по себе, не обращаясь к соседним методам, то можно юзать статический, особенно если его приходится часто вызывать..
    наверное не совсем ясно изложил, но вот на примере:
    статический класс работы с файлом, методы getMimeType(), move(), delete() и т.д.
    т.е. где то на бескрайних просторах кода понадобилось удалить файл, пишем

    File::delete($file);

    вместо

    $file = new File($file);
    $file->delete();
    unset($file);


    товарищ Вася прав, когда удобно - тогда и юзать
  • vasa_c

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

    Spritz 28 февраля 2008 г. 14:53, спустя 3 минуты 20 секунд

    Статические методы, это методы, которые не относятся к объектам.
    Это по-сути почти то же, что и глобальные функции/переменные.
    Только если это методы/свойства относятся как-то к области действия объектов, то есть удобный способ хранить их в пространстве имен класса + ограничивать доступ к ним извне и получать внутри них доступ к скрытым элементам объектов.
  • kendo

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

    Spritz 28 февраля 2008 г. 21:02, спустя 6 часов 8 минут 47 секунд


    Там где удобно оправдано, там где нет - не оправдано.

    Все гениальное - просто :)
    Спасибо за ваши ответы ;)
  • vasa_c

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

    Spritz 28 февраля 2008 г. 21:17, спустя 15 минут 7 секунд

    mechanic, File::delete() лучше не только, потому что проще, но и потому что более правильно. Объект не должен сам себя удалять.
    Так же в статику можно вынести и открытие файла (по сути конструктор объекта не должен открывать внешний ресурс):

    $file = File::open('path', 'w');
    $file->write('str');
  • ghost

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

    Spritz 29 февраля 2008 г. 14:52, спустя 17 часов 35 минут 4 секунды

    метод не относящийся к конкретному объекту лучше делать статическим.
    напр есть объект session

    метод delOld($time=2000), чистящий старые сессии, должен быть статикой
    метод update() относится к конкретной сессии, след не статика.
  • kendo

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

    Spritz 1 марта 2008 г. 11:37, спустя 20 часов 44 минуты 32 секунды

    vasa_c, кстати, с конструкотором файлов неплохо придумано.
    Что ж, буду эксперементировать :)
  • Patrick

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

    Spritz 2 марта 2008 г. 0:36, спустя 12 часов 59 минут 1 секунду

    Всё у вас хорошо и прекрасно, но на практике выходят грабли!!!

    При использовании в каком-либо классе статического метода мы явно указываем название класса со статическим методом. Таким образом возникает зависимость нашего от класса со статическим методом.

    Такая зависимость нашего кода от класса со статическим методом является нарушением принципа инверсии зависимостей. В книге Роберта Мартина «Быстрая разработка программ», данный принцип раскрыт следующим образом - рекомендуется не использовать зависимость от статичного класса - все взаимоотношения в программе поддерживаются с помощью абстрактного класса или интерфейса. Тестирование позволяет находить такие места, где данное нарушение особо опасно для дизайна системы.
  • ghost

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

    Spritz 2 марта 2008 г. 2:45, спустя 2 часа 9 минут 31 секунду

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

    поясни каким образом и где возможны грабли.
  • Patrick

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

    Spritz 2 марта 2008 г. 3:52, спустя 1 час 6 минут 22 секунды

    поясни каким образом и где возможны грабли.

    Вот тут wiki.agiledev.ru/doku.php?id=ooad:dependency_injection очень хорошо всё описанно
  • vasa_c

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

    Spritz 2 марта 2008 г. 11:01, спустя 7 часов 9 минут 31 секунду

    Patrick, поясни примером.

    Допустим тот же класс сеансов, о котором говорит ghost:

    класс cSession

    объекты соответствуют сессиям и имеют методы:
    setUser() - установить авторизованного пользователя
    setVar() - установить переменную сеанса
    getVar() - получить переменную сеанса

    конструктор закрытый, получить объект можно из двух статических методов:
    cSession::make() - создать новую сессию
    cSession::getBySID($sid) - получить сессию по идентификатору (пришедшему в куках)

    плюс еще статические методы:
    cSession::delete() - удалить сессию
    cSession::deleteOld() - удалить старые

    Где здесь подводные камни и как от них спастись абстрактными классами и интерфейсами?
  • Patrick

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

    Spritz 2 марта 2008 г. 14:52, спустя 3 часа 50 минут 30 секунд

    vasa_c
    Сеанс можно хранить как в файлах(средствами PHP), в БД и в memcache, к примеру, вот  реалии изменились и нам надо сменить драйвер, что ты будешь делать? Переписывать класс cSession?

    Не говоря уже что все наши клиенты класса cSession будут зависить от реализации этого класса, а не от интерфейса.
    Выход использовать IoC контейнеры. В одном месте программы мы указываем какой класс у нас будет отвечать за сеанс, и всё вся программа будет работать именно с этой реализацией сеанса, поменялись требования, мы создали 1 класс и переписали 1 строчку кода.
  • vasa_c

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

    Spritz 2 марта 2008 г. 14:56, спустя 4 минуты

    В этом случае я воспользуюсь возможностью, которая есть в PHP и позволяет городить гораздо меньше абстракций в отличии от языков, где её нет.
    Я напишу две реализации одного и того же класса в отдельных файлах и подключу нужный.
  • Patrick

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

    Spritz 2 марта 2008 г. 14:58, спустя 2 минуты 41 секунду

    vasa_c
    Т.е. название файла будет не соответствовать названию класса?

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