Замена глобальных переменных, как и почему - PullRequest
5 голосов
/ 09 августа 2011

Хорошо, поэтому я работал и использовал свои глобальные переменные до сих пор, и не было проблем с простым вызовом $ USER для получения идентификатора пользователя.

В большинстве случаев от людей на SO и некоторых читающих здесь и там все это было так негативно по отношению к использованию глобальной переменной.

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

Прямо сейчас я включаю функцию protect (), которая проверяет ваш сеанс и создает глобальные переменные, такие как $ USER, $ USERTYPE.

И тогда я могу просто использовать эти переменные столько раз, сколько захочу в файле.

Что может заменить это? Я думал о создании $ USER = grabUserid (); который вернет идентификатор пользователя, и то же самое для типа пользователя, то есть уже 2 функции, и тогда мне нужно будет создать функцию с запросами к базе данных для каждой переменной?

А что касается моего $ connect, который является объектом PDO для базы данных, обрабатывающей все мои запросы, мне нужно было бы сделать $ connect = connectdb (); тоже

А что касается http-запросов с js в другой php-файл, мне нужно было бы передать его, но между ними это может быть небезопасно (если вы думаете о безопасности), поскольку вы можете просто манипулировать идентификатором пользователя между ними ..

Или, может быть, есть третье решение сделать это? Или я должен просто придерживаться глобалов? И раз и навсегда, пожалуйста, укажите, почему глобальные переменные так плохи? это безопасность? или вид грязного кодирования?

Ответы [ 2 ]

9 голосов
/ 09 августа 2011

Итак, этот вопрос на самом деле состоит из двух вопросов: почему я перестал бы использовать глобальные переменные и как мне реализовать аналогичную функциональность с другой конструкцией.

Во-первых, почему вы можете отказаться от использования глобальных переменных:
Позвольте мне сказать, что не использование глобальных переменных - это не правило, а правило. Хотя по обе стороны вопроса есть фанатики, есть и веские причины за и против (хотя я слышал больше против, чем за). Некоторые причины, по которым вы можете избежать глобальных переменных:

  1. Контроль доступа
    Это, вероятно, самая большая и самая веская причина не использовать глобалы. С помощью конструкции глобальной переменной любой код может использовать данные, хранящиеся в переменной, любым способом, независимо от области действия или причины. Правила доступа могут быть нарушены, а данные могут быть аннулированы безрассудной записью. Неподтвержденный доступ означает ненадежные данные.

  2. параллелизм
    Если у вас есть глобальная переменная, которая по определению не имеет явных правил доступа, параллелизм может стать реальной проблемой. Если два одновременно запущенных экземпляра или функции получают доступ к одним и тем же данным, невозможно гарантировать порядок, в котором происходит чтение или запись, что еще больше загрязняет ваши данные.

  3. Соединение / Конструкция / Четкость кода
    Проще говоря, когда вы используете глобальные переменные в OOPHP, скорее всего, вы программируете свой способ передачи данных более прямым способом. Запись с использованием глобальных переменных подразумевает тесную связь между процедурами, использующими эти данные, а также затрудняет понимание потока данных. Рефакторинг является почти необходимостью в большинстве случаев.

Во-вторых, как вы можете избежать глобальных переменных:

  1. Статические переменные / объекты
    Один из лучших способов избежать глобальных переменных - это обернуть ваши «глобальные» данные в статический объект. Это позволяет обеспечить минимальный уровень безопасности кода для создания методов получения и установки данных, которые могут либо ограничивать проверку, ограничивать доступ или, по крайней мере, блокировать ваши глобальные переменные по мере необходимости. Это может быть немного лишнее кодирование, но уровень защиты данных, который вы получаете, того стоит.

  2. Рефакторинг
    Подумайте о причине, по которой вы используете свои глобальные данные. Вы просто пытаетесь обойти эти данные между функциями? Вы пытаетесь создать постоянные данные, которые могут быть так же легко (и более эффективно) обрабатываться $ Session? Часто глобалы являются временными пробелами для быстрой и простой конфигурации или работы сеанса. Использование файлов конфигурации или сеансов добавляет уровень функциональности, расширяемости и безопасности, который часто стоит дополнительной работы.

Есть несколько случаев, когда глобальные переменные могут быть полезны. В очень небольших программах, где безопасность данных совершенно не имеет значения, или когда ваши данные ИСТИННО используются по всему коду без какого-либо четкого способа их передачи или избежания проблем с областью действия, может быть целесообразно использовать глобальные переменные, но в целом это плохая практика.

Хороший способ думать об этом - «что произойдет с моим сценарием, если мои глобальные данные окажутся мусором». Если ответом является что-то, кроме «не очень, действительно», то вам, вероятно, следует найти способ защитить эти данные или переосмыслить то, как вы их используете.

2 голосов
/ 09 августа 2011

Вам нужно будет использовать сеансы и переменные сеанса.

Сеансы позволяют php создавать уникальный идентификатор для каждого текущего пользователя.Идентифицируя каждого отдельного пользователя, php может создавать переменные, специфичные для этого сеанса.

Например, вы, вероятно, создадите переменные сеанса, такие как $ Session ["memberID"], $ Session ["last_page_visited"]и т. д. Красота этого заключается в том, что каждый сеанс может иметь доступ только к своим переменным, и никто не использует его.

Кроме того, сам сеанс будет иметь тайм-аут по истечении заданного периода времени.Это очистит все переменные, связанные с этим сеансом.Вот почему использование глобальных переменных немного плохо.

  1. Глобальные переменные допускают неожиданные результаты.Вы не знаете, откуда берется переменная или кто к ней прикоснулся в последний раз.
  2. Глобальная область действия, поэтому проблема безопасности
  3. Использование памяти.Если вы используете глобальные переменные для хранения большого количества информации, потому что нет никакой области, в которой данные будут задерживаться в течение очень долгого времени.Я не уверен, когда глобальные переменные очищены (если вообще).
...