Форум → Программирование → PHP для идиотов → PHP и ООП → Статические методы и свойства
Статические методы и свойства
Страницы: ← Следующая страница →
-
28 февраля 2008 г. 14:40, спустя 31 минуту 20 секунд
Там где удобно оправдано, там где нет - не оправдано. -
28 февраля 2008 г. 14:50, спустя 9 минут 55 секунд
если код в методе может работать сам по себе, не обращаясь к соседним методам, то можно юзать статический, особенно если его приходится часто вызывать..
наверное не совсем ясно изложил, но вот на примере:
статический класс работы с файлом, методы getMimeType(), move(), delete() и т.д.
т.е. где то на бескрайних просторах кода понадобилось удалить файл, пишем
File::delete($file);
вместо
$file = new File($file);
$file->delete();
unset($file);
товарищ Вася прав, когда удобно - тогда и юзать -
28 февраля 2008 г. 14:53, спустя 3 минуты 20 секунд
Статические методы, это методы, которые не относятся к объектам.
Это по-сути почти то же, что и глобальные функции/переменные.
Только если это методы/свойства относятся как-то к области действия объектов, то есть удобный способ хранить их в пространстве имен класса + ограничивать доступ к ним извне и получать внутри них доступ к скрытым элементам объектов. -
28 февраля 2008 г. 21:02, спустя 6 часов 8 минут 47 секунд
Там где удобно оправдано, там где нет - не оправдано.
Все гениальное - просто :)
Спасибо за ваши ответы ;) -
28 февраля 2008 г. 21:17, спустя 15 минут 7 секунд
mechanic, File::delete() лучше не только, потому что проще, но и потому что более правильно. Объект не должен сам себя удалять.
Так же в статику можно вынести и открытие файла (по сути конструктор объекта не должен открывать внешний ресурс):$file = File::open('path', 'w');
$file->write('str'); -
29 февраля 2008 г. 14:52, спустя 17 часов 35 минут 4 секунды
метод не относящийся к конкретному объекту лучше делать статическим.
напр есть объект session
метод delOld($time=2000), чистящий старые сессии, должен быть статикой
метод update() относится к конкретной сессии, след не статика. -
1 марта 2008 г. 11:37, спустя 20 часов 44 минуты 32 секунды
vasa_c, кстати, с конструкотором файлов неплохо придумано.
Что ж, буду эксперементировать :) -
2 марта 2008 г. 0:36, спустя 12 часов 59 минут 1 секунду
Всё у вас хорошо и прекрасно, но на практике выходят грабли!!!
При использовании в каком-либо классе статического метода мы явно указываем название класса со статическим методом. Таким образом возникает зависимость нашего от класса со статическим методом.
…
Такая зависимость нашего кода от класса со статическим методом является нарушением принципа инверсии зависимостей. В книге Роберта Мартина «Быстрая разработка программ», данный принцип раскрыт следующим образом - рекомендуется не использовать зависимость от статичного класса - все взаимоотношения в программе поддерживаются с помощью абстрактного класса или интерфейса. Тестирование позволяет находить такие места, где данное нарушение особо опасно для дизайна системы. -
2 марта 2008 г. 2:45, спустя 2 часа 9 минут 31 секунду
хм..ща использую статичечкий класс для работы с базой, еще один стат класс для работы с картинками, еще один стат класс для преобразований типов данных..
граблей пока небыло.. Зачем создавать столько объектов лично мне не понятно пока..
поясни каким образом и где возможны грабли. -
2 марта 2008 г. 3:52, спустя 1 час 6 минут 22 секунды
поясни каким образом и где возможны грабли.
Вот тут wiki.agiledev.ru/doku.php?id=ooad:dependency_injection очень хорошо всё описанно -
2 марта 2008 г. 11:01, спустя 7 часов 9 минут 31 секунду
Patrick, поясни примером.
Допустим тот же класс сеансов, о котором говорит ghost:
класс cSession
объекты соответствуют сессиям и имеют методы:
setUser() - установить авторизованного пользователя
setVar() - установить переменную сеанса
getVar() - получить переменную сеанса
конструктор закрытый, получить объект можно из двух статических методов:
cSession::make() - создать новую сессию
cSession::getBySID($sid) - получить сессию по идентификатору (пришедшему в куках)
плюс еще статические методы:
cSession::delete() - удалить сессию
cSession::deleteOld() - удалить старые
Где здесь подводные камни и как от них спастись абстрактными классами и интерфейсами? -
2 марта 2008 г. 14:52, спустя 3 часа 50 минут 30 секунд
vasa_c
Сеанс можно хранить как в файлах(средствами PHP), в БД и в memcache, к примеру, вот реалии изменились и нам надо сменить драйвер, что ты будешь делать? Переписывать класс cSession?
Не говоря уже что все наши клиенты класса cSession будут зависить от реализации этого класса, а не от интерфейса.
Выход использовать IoC контейнеры. В одном месте программы мы указываем какой класс у нас будет отвечать за сеанс, и всё вся программа будет работать именно с этой реализацией сеанса, поменялись требования, мы создали 1 класс и переписали 1 строчку кода. -
2 марта 2008 г. 14:56, спустя 4 минуты
В этом случае я воспользуюсь возможностью, которая есть в PHP и позволяет городить гораздо меньше абстракций в отличии от языков, где её нет.
Я напишу две реализации одного и того же класса в отдельных файлах и подключу нужный. -
2 марта 2008 г. 14:58, спустя 2 минуты 41 секунду
vasa_c
Т.е. название файла будет не соответствовать названию класса?
Страницы: ← Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!