Php использование глобальных переменных в функции. PHP глобальная переменная в функции. Сделать переменную глобальной в PHP. Находит попытку подмены

  • 03.11.2019

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

Область видимости

Так называют контекст, в рамках которого и определяется переменная. В большинстве случаев они имеют только одну область видимости. Когда в PHP глобальные переменные подгружаются с других файлов, то в ней они могут быть включаемыми (include) и требуемыми (require).

По умолчанию они ограничены локальной областью видимости функции. А как сделать, чтобы переменную видели файлы за её границами, причем могли бы ещё и использовать? Для этого и предусмотрена в PHP глобальная переменна.

Ключевое слово "global"

А вот как объявить глобальную переменную PHP? В достижении этой цели нам поможет слово "global". Размещать его необходимо перед переменной, которую необходимо сделать глобальной (наример, global «Переменная»).

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

Почему такая странная формулировка? Дело в том, что одновременно с этим могут существовать и локальные версии. Но доступными они будут исключительно в тех файлах, где объявлены. А для всех остальных будут действовать глобальные переменные класса PHP. Поэтому необходимо быть осторожным. И чтобы не было сомнений, вот вам пример, как они выглядят: global a.

Поскольку, если один файл будет иметь доступ к нескольким переменным, это вызовет их конфликт. Но здесь нельзя точно сказать - локальная или глобальная переменная будет считываться, или же и вовсе возникнет ошибка. Так, если её прописать внутри функции, то проблем быть не должно. Но использование переменной за её границами будет проблематическим. Поэтому необходимо внимательно следить за структурой составления программного кода и убеждаться, что нигде нет даже предпосылок для того, чтобы возник упомянутый конфликт.

Другой вариант записи

Можно ли в PHP создать глобальную переменную другим способом? Да, и даже не одним. Для начала давайте рассмотрим $GLOBALS. Это ассоциативный в нём - это имя. В качестве значения выступает содержимое глобальной переменной. Следует отметить, что данный массив после объявления существует в любой области видимости. Это даёт основания считать его суперглобальным. Выглядит он таким образом: $GLOBALS["Переменная"] .

Предопределённые/суперглобальные переменные

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

В этом языке программирования имеются свои особенности. Так, важным является то, что предопределённые переменные здесь не имеют установки «супер», то есть они доступны не во всех местах. Как же это исправить? Чтобы предопределённая переменная была доступна в какой-то локальной области, её необходимо объявлять следующим образом: global «Переменная». Вроде бы то же, что и ранее рассказывалось, верно? Верно, да не совсем. Давайте рассмотрим уже «боевой» пример:

  • global $HTTP_POST_VARS;
  • echo $HTTP_POST_VARS["name"].

Чувствуете разницу между ними? Имейте ввиду, что в PHP глобальная переменна не обязательно должна быть использована в рамках функции. Она вообще может быть расположена в файле, который в неё включается.

Ссылки и безопасность

Как видите, в PHP создать глобальную переменную не проблема. А вот есть ли какие-то особенности относительно ссылок? Да, может быть неожиданное поведение при использовании global. Но перед этим небольшая предыстория.

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

Так, если register_globals находится во включенном состоянии, то перед исполнением написанного кода инициализируются различные переменные, которые необходимы, например, чтобы отправлять HTML-формы. Поэтому и было принято решение отключить её.

Почему состоянием данной директивы в php глобальная переменная обязана многим? Дело в том, что при включенном состоянии разработчики не всегда с уверенность могли сами себе ответить на вопрос, откуда она пришла. С одной стороны, это облегчало написание кода. Но с другой - это создавало угрозу безопасности. Поэтому, чтобы избежать ошибок, а также перемешивания данных и была отключена директива.

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

Опасный код

Давайте установим, что переменная является истинной для тех, кто прошел авторизацию:

if (authenticate_user()) {
$authorize = true;
}

if ($authorize) {
include "/highly/sensitive/data.php";
}

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

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

Надёжный вариант кода

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

if (isset($_SESSION["username"])) {

Echo "Привет {$_SESSION["username"]}";

Echo "Привет Guest
";
echo "Приветствую, пользователь!";

Сделать подмену в этом случае уже будет сложно. Но всё же - возможно. Для этого необходимо позаботится о том, чтобы были предусмотрены инструменты оперативного реагирования. Если необходимо в PHP включить глобальные переменные, то можно использовать следующий инструмент: если мы знаем, в каком диапазоне будет полученное значение, можно прописать, чтобы скрипт проверял это с помощью сопоставления. Конечно, это тоже не гарантирует полноценную защиту от подмены значений. Но вот перебор возможных вариантов значительно усложнит.

Находит попытку подмены

Давайте проверим, как вы поняли написанное ранее. В PHP глобальные переменные в функции, что будет предоставлена ниже, вам необходимо будет объявить самостоятельно. Можно сказать, что это в некотором роде домашнее задание по усваиванию темы урока. Вот код:

if (isset($_COOKIE["C_COOKIE"])) {
} elseif (isset($_GET["C_COOKIE"]) || isset($_POST["C_COOKIE"])) {

Mail("[email protected]", "Внимание, скриптом была зафиксирована попытка взлома и подмены данных", $_SERVER["REMOTE_ADDR"]);
echo "Была нарушена безопасность или попытка так сделать. Администратор уведомлён";
exit;

} else {
}
?>

А теперь пояснения к нему. Переменная C_COOKIE приходит к нам из достоверного источника. Чтобы полностью в убедится в соответствии результата ожидаемому, мы проверяем её значение и в случае проблем уведомляем об этом администратора. Если же ничего не пришло, то никаких действий и не нужно совершать. Нужно понимать, что простое отключение директивы register_globals не делает ваш код безопасным. Поэтому любая переменная, которую получает скрипт от пользователя, должна быть проверена на ожидаемое значение.

Заключение

Вот, в общем, и всё, что необходимо знать про глобальные переменные, чтобы успешно и безопасно использовать их в своей деятельности. Конечно, сказать, что существует полноценная гарантия того, что ними никто не воспользуется нельзя - взломщики постоянно совершенствуют свои методы и умения. Поэтому желательно по максимуму ограничить использование глобальных переменных в коде. Благо, структура и особенности построения этого языка программирования позволяют достичь данной цели. Успехов!

В JavaScript глобальные переменные имеют огромное значение, и они постоянно используются при написании скриптов. В PHP глобальные переменные - редко замечаемое явление, особенно если Вы используете ООП , однако, знать о них стоит. Если Вы вдруг не знаете про глобальные переменные в PHP , то эта статья заполнит этот пробел в знаниях.

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

Давайте разберём вот такой пример PHP-кода :

$x = 5; // Создаём переменную (разумеется, она глобальная)
function myFunc1() {
$x = 7; // Локальная переменная, доступная только внутри функции
}
function myFunc2() {
global $x; // Указываем, что $x - это глобальная переменная
$x = 7; // Изменяем глобальную переменную $x
}
myFunc1();
echo $x; // Выведет 5
echo "
";
myFunc2();
echo $x; // Выведет 7
print_r($GLOBALS); // Выводит все глобальные переменные
?>

При выводе $x в первый раз мы получили 5 , поскольку внутри функции myFunc1() мы создали локальную переменную $x , которая ничего общего с глобальной переменной $x не имеет. Таким образом, мы, изменяя значение локальной переменной, никак его не изменили у глобальной.

Во 2-ой функции мы перед использованием $x указали, что внутри данной функции $x должна быть глобальной, то есть мы внутри функции получили доступ к глобальной переменной. В результате, мы изменили её значение, о чём нам echo и сообщил.

И в конце скрипта я вывел ассоциативный массив $GLOBALS , который содержит все глобальные переменные в скрипте. Разумеется, там не только $x , но и масса служебных переменных. И в функции, и за пределами функции Вы всегда можете обратиться к любому элементу в этом массиве и изменить его.

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

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

Наиболее правильный подход заключался бы в том, чтобы поместить набор операций в виде функций/класса с собственным именем в файл, подключить файл (без какого-либо оператора возврата за пределами функций), а затем вызывать функцию явно с требуемым набором аргументов.

Так в чем проблема-то?

Все предельно просто, вы делаете include внутри метода method , а значит переменные указанные в подключаемом файле инициализируются в области видимости метода method . Следовательно, переменная $lang не является глобальной, а ограничена видимостью метода , а вы обращаетесь к глобальной переменной, поэтому при использовании модификатора global она будет равна null.

Если делать include в глобальной области видимости, тогда переменная lang станет общедоступной (global) и ее использование станет возможным. Это легко проверить, достаточно в подключаемом файле перед началом определения какой-либо переменной написать global $переменная.

Пример:

include "file1.php"; function include2() { include "file2.php"; }
  • file1.php определен в глобальной области видимости.
  • file2.php определен в локальной области видимости функции include2.

Подход с глобальными переменными и таким include - это костыль, который принесет вам проблем в будущем. Функции должны быть определены явно, иметь уникальное имя и выполняться по требованию.

А почему подход с глобальными переменными плохой?

Дело в том, что глобальные переменные видимы отовсюду, глобально. Это удобно: ведь нет никаких ограничителей. С другой стороны, становится совершенно невозможно отследить, кто меняет данные. Неконтролируемые изменения - это первое, что обычно приходит в голову на вопрос о том, чем же плохи глобальные переменные.

Предположим, у вас есть функция, результат которой зависит от глобальной переменной. Вы вызываете её, вызываете - но через 10 минут функция начинает возвращать неверные результаты. Что случилось? Ведь на вход вы передаёте ей всё тот же набор параметров? Гм, кто-то поменял значение глобальной переменной... Кто это мог быть? Да кто угодно - ведь глобальная переменная доступна всем..

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

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

Знаете какой наилучший префикс для глобальных переменных?

В данном уроке рассматривается область видимости переменных PHP. Объясняется различие локальной и глобальной области видимости, показывается как получить доступ к глобальным переменным внутри функции, как работать с суперглобалами и создавать статические переменные.

Когда приступаешь к изучению PHP и начинаешь работать с функциями и объектами, область видимости переменных вызывает некоторое смущение. К счастью правила PHP в этом отношении очень просты для понимания (в сравнении с другими языками программирования).

Что такое область видимости?

Область видимости переменных - это контекст, в рамках которого переменная была определена и где к ней можно получить доступ. В PHP имеется две области видимости переменных:

  • Глобальная - к переменным можно получить доступ в любом месте скрипта
  • Локальная - к переменным можно получить доступ только внутри функции, в которой они были определены

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

Переменные с глобальной областью видимости называются глобальными, а с локальной областью видимости - локальными.

Вот пример того, как работают глобальные и локальные переменные.

"; } sayHello(); echo "Значение \$globalName: "$globalName"
"; echo "Значение \$localName: "$localName"
"; ?>

Привет, Гарри! Значение $globalName: "Зоя" Значение $localName: ""

В данном скрипте мы создали две переменных:

  • $globalName - это глобальная переменная
  • $localName - это локальная переменная, которая создана внутри функции sayHello() .

После создания переменной и функции скрипт вызывает sayHello() ,который выводит "Привет, Гарри!" . Затем скрипт пытается вывести значения двух переменных с помощью функции echo . Вот что происходит:

  • Так как $globalName была создана вне функции, она доступна в любом месте скрипта, поэтому выводится "Зоя" .
  • $localName будет доступна только внутри функции sayHello() . Так как выражение echo находится вне функции, PHP не дает доступа к локальной переменной. Вместо этого, PHP предполагает, что код будет создавать новую переменную с именем $localName , которая получит значение по умолчанию - пустую строку. вот почему второй вызов echo выводит значение "" для переменной $localName .

Доступ к глобальным переменным внутри функции

Для получения доступа к глобальной переменной вне функции достаточно просто написать ее имя. Но для получения доступа к глобальной переменной внутри функции , нужно сначала объявить переменную как глобальную в функции с помощью ключевого слова global:

Function myFunction() { global $globalVariable; // Доступ к глобальной переменной $globalVariable }

Если не сделать этого, то PHP предполагает, что вы создаете или используете локальную переменную.

Вот пример скрипта, который использует глобальную переменную внутри функции:

"; global $globalName; echo "Привет, $globalName!
"; } sayHello(); ?>

При выполнении скрипт выведет:

Привет, Гарри! Привет, Зоя!

Функция sayHello() использует ключевое слово global для объявления переменной $globalName как глобальной. После чего она может получить доступ к переменной и вывести ее значение ("Зоя").

Что такое суперглобалы?

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

Вот список суперглобалов, доступных в PHP версии 5.3:

  • $GLOBALS - список всех глобальных переменных в скрипте (исключая суперглобалов)
  • $_GET - содержит список всех полей формы, отправленной браузером с помощью запроса GET
  • $_POST - содержит список всех полей формы отправленной браузером с помощью запроса POST
  • $_COOKIE - содержит список всех куки, отправленных браузером
  • $_REQUEST - содержит все сочетания ключ/значение, которые содержатся в массивах $_GET, $_POST, $_COOKIE
  • $_FILES - содержит список всех файлов, загруженных браузером
  • $_SESSION - позволяет хранить и использовать переменные сессии для текущего браузера
  • $_SERVER - содержит информацию о сервере, такую как, имя файла выполняемого скрипта и IP адрес браузера.
  • $_ENV - содержит список переменных среды, передаваемых PHP, например, CGI переменные.
Например, можно использовать $_GET для того, чтобы получить значения переменных заключенных в строке URL запроса скрипта, и вывести их на странице:

Если вы запустите выше приведенный скрипт с помощью строки URL http://www.example.com/script.php?yourName=Фред, то он выведет:

Привет, Фред!

Предупреждение! В реальном скрипте никогда нельзя использовать подобную передачу данных по причине слабой безопасности. Нужно всегда осуществлять проверку или фильтрацию данных.

Суперглобал $GLOBALS очень удобно использовать, так как он дает возможность организовать доступ к глобальным переменным в функции без необходимости использования ключевого слова global . Например:

"; } sayHello(); // Выводит "Привет, Зоя!" ?>

Статические переменные: они находятся где-то рядом

Когда вы создаете локальную переменную внутри функции, она существует только пока работает функция. При завершении функции локальная переменная исчезает. Когда функция вызывается снова, создается новая локальная переменная.

В большинстве случаев это отлично работает. Таким образом функции самодостаточны и работают всегда одинаково при каждом вызове.

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

Для создания статической переменной в функции нужно использовать ключевое слово static перед именем переменной и обязательно задать ей начальное значение. Например:

Function myFunction() { static $myVariable = 0; }

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


"; echo createWidget() . " мы уже создали.
"; echo createWidget() . " мы уже создали.>
"; ?>

Но, так как переменная $numWidgets создается каждый раз при вызове функции, то мы получим следующий результат:

Создаем некие виджеты... 1 мы уже создали. 1 мы уже создали. 1 мы уже создали.

Но с использованием статической переменной, мы сможем сохранять значение от одного вызова функции к другому:

"; echo createWidget() . " мы уже создали.
"; echo createWidget() . " мы уже создали.
"; echo createWidget() . " >мы уже создали.
"; ?>

Теперь скрипт выдаст ожидаемый результат:

Создаем некие виджеты... 1 мы уже создали. 2 мы уже создали. 3 мы уже создали.

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

Вот и все! Почаще обращайтесь к документации по PHP.

Последнее обновление: 1.11.2015

При использовании переменных и функций следует учитывать области видимости переменных. Область видимости задает область действия, доступности данной переменной.

Локальные переменные

Локальные переменные создаются внутри функции. К таким переменным можно обратиться только изнутри данной функции. Например:

В данном случае в функции get() определена локальная переменная $result . И из общего контекста мы не можем к ней обратиться, то есть написать $a = $result; нельзя, так как область действия переменной $result ограничено функцией get() . Вне этой функции переменной $result не существует.

То же самое относится и к параметрам функции: вне функции параметры $lowlimit и $highlimit также не существуют.

Как правило, локальные переменные хранят какие-то промежуточные результаты вычислений, как и в примере выше.

Статические переменные

На локальные переменные похожи статические. Они отличаются тем, что после завершения работы функции их значение сохраняется. При каждом новом вызове функция использует ранее сохраненное значение. Например:

Чтобы указать, что переменная будет статической, к ней добавляется ключевое слово static . При трех последовательных вызовах функции getCounter() переменная $counter будет увеличиваться на единицу.

Если бы переменная $counter была обычной нестатической, то при каждом вызове функция getCounter() выводила бы 1.

Как правило, статические переменные служат для создания различных счетчиков, как в примере выше.

Глобальные переменные

Иногда требуется, чтобы переменная была доступна везде, глобально. Подобные переменные могут хранить какие-то общие для всей программы данные. Для определения глобальных переменных используется ключевое слово global :1

"; } getGlobal(); echo $gvar; ?>

После вызова функции getGlobal() к переменной $gvar можно будет обратиться из любой части программы.