Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > массив глобальных переменных


Автор: Echo 15.1.2007, 17:47
Напишите, как вы организуете хранение данных, доступность которых требуется из всего скрипта.
Т.е. как лучше всего хранить данные, к которым должна быть возможность обратиться из любых точек скрипта - в том числе из подключенных файлов и классы.

массив $GLOBALS не хотелось бы использовать т.к. в нем изначально много данных и , например , при отладке трудно отделить свои переменные от созданных PHP. 
Что касается создания своего глобального массива - то каждый раз объявлять его внутри всех функций как глобальный - требует по-крайней мере внимательности еще и на это.

Можно ли использовать для таких целей $_ENV? Или как лучше?..

Автор: skyboy 15.1.2007, 17:50
я "глобальные" данные передаю параметром там, где вызов функций.
там, где происходит include, доступность и так есть.

Автор: mishaSL 15.1.2007, 17:58
Если у тебя все на классах, то можешь в конструктаре каждого класса объявлять, если же нет, то придется в каждой функции либо объявлять global, либо передавать параметром. А константы объявляешь(define), и они доступны во всем скрипте. 

Автор: Mal Hack 15.1.2007, 18:17
Использование глобальных переменных считается плохим тоном и ошибкой проектирования.

Автор: BobiKK 15.1.2007, 18:42
Вариант решения:
http://www.phppatterns.com/docs/design/the_registry

Автор: Echo 15.1.2007, 18:56
Цитата(Mal Hack @ 15.1.2007,  18:17)
Использование глобальных переменных считается плохим тоном и ошибкой проектирования.

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

Автор: skyboy 15.1.2007, 19:06
Цитата(Echo @  15.1.2007,  17:56 Найти цитируемый пост)
обрабатываем полученные от пользователя данные и создаем на основе них переменные

про сессии слыхал чего?

Автор: Echo 15.1.2007, 19:12
skyboy, и зачем?
речь о пределах одного запроса пользователя

Автор: Mal Hack 15.1.2007, 19:14
Echo, я не хочу вдаваться в дискуссию касательно того, что лучше, что хуже.
Использование ГП ведет к ввозможным ошибкам и т.п. Само собой при решении задач иногда бывает нужно это сделать и ничего плохого в этом не будет, но вот злоупотреблять этим - себе дороже.


Автор: sergejzr 15.1.2007, 19:20
Самым лучшим решением считаю статические мемберы класса. Для отладки самое то, имена не могут пересекаются и некоторые ИДЕ (например эклипса) могут их подсказывать. Вообще идея из JAVA, где такой паттерн уже давно используется.

Код

class Container
{
   private static $value1="somestaticval1";
   public static function getValue1()
   {
      return $value1;
   }
   public static function setValue1($value)
   {
       Database::value=$value1;
   }

private static $value2="somestaticval";
     //  :
     //  :
     //итд, итп

}

print Container::getValue1();


Цитата(Mal Hack @  15.1.2007,  17:17 Найти цитируемый пост)
Использование глобальных переменных считается плохим тоном и ошибкой проектирования. 

Это верно, но иногда ИМХО есть смысл, если в приложении больше одного обьекта не существует.
Например connection к базе данных, или темплейт для генерации страниц, или обьект - переводчик, или обьект для логгинга ошибок. (В принципе только эти четыре мне и попадались)

Автор: Mal Hack 15.1.2007, 19:33
sergejzr, а в таком случае можно их как ссылкой в свойство класса занести из того, откуда вызываются

Автор: sergejzr 15.1.2007, 19:37
Кстати и константы можно так определить

Код

class Container
{
public static final $SOME_CONSTANT="somestaticval1";

//...

Автор: Diesel Draft 18.1.2007, 04:42
Я использую Фреймворк. Там глобальные данные предназначены только для настоек самого Фреймворка. Я согласен с Mal Hack  что это плохой тон в программировании

Автор: Echo 21.1.2007, 12:47
sergejzr, да, спасибо.
теперь изучаю smile
идея очень понравилась 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)