Intereting Posts
Зачем использовать bin2hex при вставке двоичных данных из PHP в MySQL? UploadFile с значениями POST с помощью WebClient Codeigniter передает данные из контроллера для просмотра Когда вам понадобится использовать позднюю статическую привязку? PHP $ это, когда нет в контексте объекта для установки общедоступной переменной из вне класса doctrine2 – Как повысить эффективность флеша? PHP: пример формы, который будет шифровать строку запроса (GET) (скрытие данных, а не безопасность) Массив пересекается по ключу в массиве? Как изменить URL-адрес перенаправления по умолчанию фильтра Laravel 5 Auth? OAuth: сохранение токена доступа и секретности Получить координаты широты / долготы с карты Google с помощью маркера Форма отправляется без обновления с помощью jquery / ajax, если страница имеет более одной формы Как получить тип содержимого файла в PHP? Как вы определяете PHP как строку? php выполняет фоновый процесс

Замена глобальных переменных, как и почему

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

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

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

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

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

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

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

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

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

Solutions Collecting From Web of "Замена глобальных переменных, как и почему"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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