Задать вопрос
@laravue
laravel

Чем плохо использование статических функций в проекте для архитектуры?

Разрабатываю на php (Laravel). Мне очень удобно насоздавать статических функций в моделе, которые бы извлекали из базы данные в зависимости от входных параметров. чем плох такой подход? во всех сервисах, где идет обращение к базе я просто вызываю эти статические метды и получаю выборки.
  • Вопрос задан
  • 329 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
myks92
@myks92
Нашёл решение — пометь вопрос ответом!
Вообще использование статистических функций это не плохо, если Вы понимаете их назначение и используете их правильно в простых вещах вроде Helper. Но не нужно превращать весь проект в статистическую бестию.

Объекты инкапсулируют состояние и поведение, а статистическая функция лишина этого.

Что сказано в документации PHP о статических функциях:

Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. К ним также можно получить доступ статически в созданном экземпляре объекта класса.

Так как статические методы вызываются без создания экземпляра класса, то псевдопеременная $this недоступна внутри статических методов. Поэтому важная причина, по которой Вам стоит избегать статических методов, заключается в том, что их использование теряет одно из преимуществ объектов. Объекты предназначены для инкапсуляции данных. Это предотвращает появление неожиданных побочных эффектов, которые позволяют избежать ошибок, улучшает тестирование. Статические методы не имеют инкапсулированных данных и поэтому не получают этого преимущества.

Так же статические методы всегда создают экземпляр объекта при загрузке приложения, независимо от того будете ли Вы использовать этот объект или нет. Это увеличивает нагрузку на память.

Что касаемо именно выборки из базы, то тут как минимум будет зависимость на одном хранилище. Что если вы сейчас хотите забирать данные из Mysql, а завтра из PosgreSQL. В вашем случае будет очень сложно перейти от одного хранилища к другому, но если бы вы использовали объект Repository, то вы бы просто написали новую реализацию и заменили бы через DI контейнер.
Ответ написан
HemulGM
@HemulGM
Delphi Developer, сис. админ
Плохо только не знание того, когда какой паттерн использовать. Вы - не знаете.
Ответ написан
@GLeBaTi
Нет никаких проблем, если вы не храните состояние/данные в статическом классе.

Но нужно смотреть в будущее:
1) Могут появиться транзакции , которые вызывают сразу несколько разных методов и где-то нужно хранить подключение (чтобы в каждом методе не подключаться). (что очень часто)
2) Может понадобится несколько реализаций под каждую СУБД (что очень редко)
3) ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы