Задать вопрос

Как глобально хранить объект?

У меня в коде есть несколько объектов, методы которых мне нужны практически во всех остальных частях программы. Но создавать все время заново эти объекты во всех функциях я не хочу; прописывать global тоже не нравится. В константах тоже не получается хранить, там только скаляр. Но, может, существует другое решение?

Конечно, можно обойтись вариантом вызова методов через :: (static), но мне бы хотелось найти более красивое решение.
  • Вопрос задан
  • 2996 просмотров
Подписаться 7 Оценить Комментировать
Решения вопроса 1
serso
@serso
Если это утилитные методы (сортировка, форматирование и т.д.), то нормальная практика — делать их статичными.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
nazarpc
@nazarpc
Open Source enthusiast
Вам нужно связать объект с определёнными участками кода, и вы тут же оборвали возможные технические способы.
Можете попробовать хранить в кеше APC (функции apc_store()/apc_fetch()) — но не уверен в том, правильно ли он будет хранить объекты. Да и между запросами такой кеш будет сохранять данные.
Ответ написан
Комментировать
EugeneOZ
@EugeneOZ
Статические методы, переменные это тоже самое, что и GLOBAL, и воняет оно абсолютно также. И к ООП это не имеет отношения — это процедурное программирование.

Если хотите именно ООП, делайте как принято в ООП — передавайте объект (dependency injection) или используйте трейт, его можно просто use и всё.

И учитывайте — если объект нужен везде, просто потому, что у него много разных методов, то нужно проверить, одну ли ответственность выполняет этот объект (читайте про SOLID и принцип единой ответственности).
Ответ написан
Комментировать
DanielWolf
@DanielWolf
Паттерн Одиночка (Singleton)
http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)

а точнее Пул одиночек (Multiton / Registry of singletons).
Ответ написан
Комментировать
taliban
@taliban
php программист
Если вам нужен обьект как сущность, то создавайте везде, если у вас класс как набор функций, то делайте статику, а если тот же обтект как сущность вам нужен лишь один раз, то уж глобал либо синглтон. Все просто =)
Ответ написан
Комментировать
AmdY
@AmdY
PHP и прочие вебштучки
Мне нравится вариант с сервис локатором, он у меня единственный singleton во фреймворке, всё остальное подтягиваю через него. Самое важное, что эти сервисы можно подменять рантайм или в тестах, что не скажешь о глобалах или статических методах.

Советую заглянуть в статью wiki.agiledev.ru/doku.php?id=ooad:dependency_injection
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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