PHP
Переменные Superglobal PHP
Поиск…
Вступление
Суперглобалы - это встроенные переменные, которые всегда доступны во всех областях.
Несколько предопределенных переменных в PHP являются «суперглобальными», что означает, что они доступны во всех областях в сценарии. Нет необходимости делать global $variable;
для доступа к ним в рамках функций или методов.
PHP5 SuperGlobals
Ниже приведены SuperGlobals PHP5
- $ GLOBALS
- $ _REQUEST
- $ _GET
- $ _POST
- $ _FILES
- $ _SERVER
- $ _ENV
- $ _COOKIE
- $ _SESSION
$ GLOBALS : эта переменная SuperGlobal используется для доступа к глобальным переменным.
<?php
$a = 10;
function foo(){
echo $GLOBALS['a'];
}
//Which will print 10 Global Variable a
?>
$ _REQUEST : эта переменная SuperGlobal используется для сбора данных, представленных HTML-формой.
<?php
if(isset($_REQUEST['user'])){
echo $_REQUEST['user'];
}
//This will print value of HTML Field with name=user submitted using POST and/or GET MEthod
?>
$ _GET : эта переменная SuperGlobal используется для сбора данных, представленных HTML-формой с методом get
.
<?php
if(isset($_GET['username'])){
echo $_GET['username'];
}
//This will print value of HTML field with name username submitted using GET Method
?>
$ _POST : эта переменная SuperGlobal используется для сбора данных, отправленных HTML-формой с использованием метода post
.
<?php
if(isset($_POST['username'])){
echo $_POST['username'];
}
//This will print value of HTML field with name username submitted using POST Method
?>
$ _FILES : эта переменная SuperGlobal содержит информацию о загруженных файлах через метод HTTP Post.
<?php
if($_FILES['picture']){
echo "<pre>";
print_r($_FILES['picture']);
echo "</pre>";
}
/**
This will print details of the File with name picture uploaded via a form with method='post and with enctype='multipart/form-data'
Details includes Name of file, Type of File, temporary file location, error code(if any error occured while uploading the file) and size of file in Bytes.
Eg.
Array
(
[picture] => Array
(
[0] => Array
(
[name] => 400.png
[type] => image/png
[tmp_name] => /tmp/php5Wx0aJ
[error] => 0
[size] => 15726
)
)
)
*/
?>
$ _SERVER : эта переменная SuperGlobal содержит информацию о скриптах, заголовках HTTP и путях сервера.
<?php
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
/**
Will print the following details
on my local XAMPP
Array
(
[MIBDIRS] => C:/xampp/php/extras/mibs
[MYSQL_HOME] => \xampp\mysql\bin
[OPENSSL_CONF] => C:/xampp/apache/bin/openssl.cnf
[PHP_PEAR_SYSCONF_DIR] => \xampp\php
[PHPRC] => \xampp\php
[TMP] => \xampp\tmp
[HTTP_HOST] => localhost
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => max-age=0
[HTTP_UPGRADE_INSECURE_REQUESTS] => 1
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8
[HTTP_ACCEPT_ENCODING] => gzip, deflate, sdch
[HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.8
[PATH] => C:\xampp\php;C:\ProgramData\ComposerSetup\bin;
[SystemRoot] => C:\Windows
[COMSPEC] => C:\Windows\system32\cmd.exe
[PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
[WINDIR] => C:\Windows
[SERVER_SIGNATURE] => Apache/2.4.16 (Win32) OpenSSL/1.0.1p PHP/5.6.12 Server at localhost Port 80
[SERVER_SOFTWARE] => Apache/2.4.16 (Win32) OpenSSL/1.0.1p PHP/5.6.12
[SERVER_NAME] => localhost
[SERVER_ADDR] => ::1
[SERVER_PORT] => 80
[REMOTE_ADDR] => ::1
[DOCUMENT_ROOT] => C:/xampp/htdocs
[REQUEST_SCHEME] => http
[CONTEXT_PREFIX] =>
[CONTEXT_DOCUMENT_ROOT] => C:/xampp/htdocs
[SERVER_ADMIN] => postmaster@localhost
[SCRIPT_FILENAME] => C:/xampp/htdocs/abcd.php
[REMOTE_PORT] => 63822
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /abcd.php
[SCRIPT_NAME] => /abcd.php
[PHP_SELF] => /abcd.php
[REQUEST_TIME_FLOAT] => 1469374173.88
[REQUEST_TIME] => 1469374173
)
*/
?>
$ _ENV : эта переменная переменной среды оболочки SuperGlobal Variable, в которой работает PHP.
$ _COOKIE : эта переменная SuperGlobal используется для получения значения Cookie с заданным ключом.
<?php
$cookie_name = "data";
$cookie_value = "Foo Bar";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
if(!isset($_COOKIE[$cookie_name])) {
echo "Cookie named '" . $cookie_name . "' is not set!";
}
else {
echo "Cookie '" . $cookie_name . "' is set!<br>";
echo "Value is: " . $_COOKIE[$cookie_name];
}
/**
Output
Cookie 'data' is set!
Value is: Foo Bar
*/
?>
$ _SESSION : эта переменная SuperGlobal используется для установки и получения значения сеанса, которое хранится на сервере.
<?php
//Start the session
session_start();
/**
Setting the Session Variables
that can be accessed on different
pages on save server.
*/
$_SESSION["username"] = "John Doe";
$_SESSION["user_token"] = "d5f1df5b4dfb8b8d5f";
echo "Session is saved successfully";
/**
Output
Session is saved successfully
*/
?>
Суберглобалы объяснили
Вступление
Проще говоря, это переменные, доступные во всех областях ваших скриптов.
Это означает, что нет необходимости передавать их в качестве параметров в своих функциях или хранить их вне блока кода, чтобы они были доступны в разных областях.
Что такое суперглобальное?
Если вы думаете, что они похожи на супергероев - это не так.
Начиная с версии PHP 7.1.3 имеется 9 суперглобальных переменных. Они заключаются в следующем:
-
$GLOBALS
- ссылки на все переменные, доступные в глобальной области -
$_SERVER
- информация о сервере и среде исполнения -
$_GET
- переменные HTTP GET -
$_POST
- переменные HTTP POST -
$_FILES
- переменные загрузки файлов HTTP -
$_COOKIE
- HTTP Cookies -
$_SESSION
- переменные сеанса -
$_REQUEST
- переменные запроса HTTP -
$_ENV
- переменные окружения
См. Документацию .
Расскажи мне больше, расскажи мне больше
Прошу прощения за ссылку Grease! Ссылка на сайт
Время для объяснения этих глобальных героев .
$GLOBALS
Ассоциативный массив, содержащий ссылки на все переменные, которые в настоящее время определены в глобальной области действия сценария. Имена переменных - это ключи массива.
Код
$myGlobal = "global"; // declare variable outside of scope
function test()
{
$myLocal = "local"; // declare variable inside of scope
// both variables are printed
var_dump($myLocal);
var_dump($GLOBALS["myGlobal"]);
}
test(); // run function
// only $myGlobal is printed since $myLocal is not globally scoped
var_dump($myLocal);
var_dump($myGlobal);
Выход
string 'local' (length=5)
string 'global' (length=6)
null
string 'global' (length=6)
В приведенном выше примере $myLocal
не отображается во второй раз, потому что он объявлен внутри функции test()
а затем уничтожен после закрытия функции.
Стать глобальным
Чтобы исправить это, есть два варианта.
Вариант один: global
ключевое слово
function test()
{
global $myLocal;
$myLocal = "local";
var_dump($myLocal);
var_dump($GLOBALS["myGlobal"]);
}
Ключевое слово global
является префиксом переменной, которая заставляет ее быть частью глобальной области.
Обратите внимание, что вы не можете назначить значение переменной в том же выражении, что и ключевое слово global. Следовательно, почему мне пришлось присваивать значение под ним. (Возможно, если вы удалите новые строки и пробелы, но я не думаю, что он global $myLocal; $myLocal = "local"
. global $myLocal; $myLocal = "local"
).
Второй вариант: $GLOBALS
array
function test()
{
$GLOBALS["myLocal"] = "local";
$myLocal = $GLOBALS["myLocal"];
var_dump($myLocal);
var_dump($GLOBALS["myGlobal"]);
}
В этом примере я переназначил $myLocal
значение $GLOBAL["myLocal"]
так как мне легче писать имя переменной, а не ассоциативный массив.
$_SERVER
$ _SERVER - это массив, содержащий информацию, такую как заголовки, пути и места расположения сценариев. Записи в этом массиве создаются веб-сервером. Нет никакой гарантии, что каждый веб-сервер предоставит любой из них; серверы могут опускать некоторые или предоставлять другим, не перечисленным здесь. Тем не менее, большое количество этих переменных учитывается в спецификации CGI / 1.1 , поэтому вы сможете их ожидать.
Пример вывода этого может быть следующим (запуск на моем ПК с Windows с помощью WAMP)
C:\wamp64\www\test.php:2:
array (size=36)
'HTTP_HOST' => string 'localhost' (length=9)
'HTTP_CONNECTION' => string 'keep-alive' (length=10)
'HTTP_CACHE_CONTROL' => string 'max-age=0' (length=9)
'HTTP_UPGRADE_INSECURE_REQUESTS' => string '1' (length=1)
'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' (length=110)
'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' (length=74)
'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate, sdch, br' (length=23)
'HTTP_ACCEPT_LANGUAGE' => string 'en-US,en;q=0.8,en-GB;q=0.6' (length=26)
'HTTP_COOKIE' => string 'PHPSESSID=0gslnvgsci371ete9hg7k9ivc6' (length=36)
'PATH' => string 'C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;E:\Program Files\ATI Technologies\ATI.ACE\Core-Static;E:\Program Files\AMD\ATI.ACE\Core-Static;C:\Program Files (x86)\AMD\ATI.ACE\Core-Static;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Intel\Intel(R) Managemen'... (length=1169)
'SystemRoot' => string 'C:\WINDOWS' (length=10)
'COMSPEC' => string 'C:\WINDOWS\system32\cmd.exe' (length=27)
'PATHEXT' => string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY' (length=57)
'WINDIR' => string 'C:\WINDOWS' (length=10)
'SERVER_SIGNATURE' => string '<address>Apache/2.4.23 (Win64) PHP/7.0.10 Server at localhost Port 80</address>' (length=80)
'SERVER_SOFTWARE' => string 'Apache/2.4.23 (Win64) PHP/7.0.10' (length=32)
'SERVER_NAME' => string 'localhost' (length=9)
'SERVER_ADDR' => string '::1' (length=3)
'SERVER_PORT' => string '80' (length=2)
'REMOTE_ADDR' => string '::1' (length=3)
'DOCUMENT_ROOT' => string 'C:/wamp64/www' (length=13)
'REQUEST_SCHEME' => string 'http' (length=4)
'CONTEXT_PREFIX' => string '' (length=0)
'CONTEXT_DOCUMENT_ROOT' => string 'C:/wamp64/www' (length=13)
'SERVER_ADMIN' => string '[email protected]' (length=29)
'SCRIPT_FILENAME' => string 'C:/wamp64/www/test.php' (length=26)
'REMOTE_PORT' => string '5359' (length=4)
'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
'REQUEST_METHOD' => string 'GET' (length=3)
'QUERY_STRING' => string '' (length=0)
'REQUEST_URI' => string '/test.php' (length=13)
'SCRIPT_NAME' => string '/test.php' (length=13)
'PHP_SELF' => string '/test.php' (length=13)
'REQUEST_TIME_FLOAT' => float 1491068771.413
'REQUEST_TIME' => int 1491068771
Там есть что взять, поэтому я подберу некоторые важные из них. Если вы хотите прочитать о них все, обратитесь к разделу индексов документации.
Я мог бы добавить их все ниже одного дня. Или кто-то может отредактировать и добавить хорошее объяснение им ниже? Подсказка, подсказка ;)
Для всех объяснений ниже предположим, что URL-адрес: http://www.example.com/index.php
-
HTTP_HOST
- адрес хоста.
Это вернетwww.example.com
-
HTTP_USER_AGENT
- содержимое пользовательского агента. Это строка, которая содержит всю информацию о браузере клиента, включая операционную систему. -
HTTP_COOKIE
- все куки в конкатенированной строке с разделителем с запятой. -
SERVER_ADDR
- IP-адрес сервера, на котором запущен текущий скрипт.
Это вернет93.184.216.34
-
PHP_SELF
- имя файла текущего исполняемого скрипта относительно корня документа.
Это вернет/index.php
-
REQUEST_TIME_FLOAT
- отметка времени начала запроса с точностью до микросекунды. Доступно с PHP 5.4.0. -
REQUEST_TIME
- отметка времени начала запроса. Доступно с PHP 5.1.0.
$_GET
Ассоциативный массив переменных передается текущему скрипту через параметры URL.
$_GET
- это массив, содержащий все параметры URL; это то, что есть после? в URL.
В качестве примера можно использовать http://www.example.com/index.php?myVar=myVal . Эта информация из этого URL-адреса может быть получена путем доступа в этом формате $_GET["myVar"]
и результатом этого будет myVal
.
Использование кода для тех, кому не нравится чтение.
// URL = http://www.example.com/index.php?myVar=myVal
echo $_GET["myVar"] == "myVal" ? "true" : "false"; // returns "true"
В приведенном выше примере используется тернарный оператор .
Это показывает, как вы можете получить доступ к значению из URL-адреса с помощью $_GET
.
Теперь еще один пример! удушье
// URL = http://www.example.com/index.php?myVar=myVal&myVar2=myVal2
echo $_GET["myVar"]; // returns "myVal"
echo $_GET["myVar2"]; // returns "myVal2"
Можно отправить несколько переменных через URL, разделив их символом амперсанда ( &
).
Риск безопасности
Очень важно не отправлять какую-либо конфиденциальную информацию через URL-адрес, поскольку она останется в истории компьютера и будет видна всем, кто имеет доступ к этому браузеру.
$_POST
Ассоциативный массив переменных передается текущему скрипту с помощью метода HTTP POST при использовании приложений / x-www-form-urlencoded или multipart / form-data в качестве HTTP Content-Type в запросе.
Очень похоже на $_GET
в том, что данные отправляются из одного места в другое.
Начну с примера. (Я пропустил атрибут action, поскольку это отправит информацию на страницу, в которой находится форма).
<form method="POST">
<input type="text" name="myVar" value="myVal" />
<input type="submit" name="submit" value="Submit" />
</form>
Выше - базовая форма, для которой данные могут быть отправлены. В реальной среде атрибут value
не будет установлен, чтобы форма была пустой. Затем он отправляет любую информацию, вводимую пользователем.
echo $_POST["myVar"]); // returns "myVal"
Риск безопасности
Отправка данных через POST также небезопасна. Использование HTTPS обеспечит безопасность данных.
$_FILES
Ассоциативный массив элементов, загруженных в текущий скрипт с помощью метода HTTP POST. Структура этого массива описана в разделе загрузки POST-метода .
Начнем с базовой формы.
<form method="POST" enctype="multipart/form-data">
<input type="file" name="myVar" />
<input type="submit" name="Submit" />
</form>
Обратите внимание, что я пропустил атрибут action
(снова!). Кроме того, я добавил enctype="multipart/form-data"
, это важно для любой формы, которая будет касаться загрузки файлов.
// ensure there isn't an error
if ($_FILES["myVar"]["error"] == UPLOAD_ERR_OK)
{
$folderLocation = "myFiles"; // a relative path. (could be "path/to/file" for example)
// if the folder doesn't exist then make it
if (!file_exists($folderLocation)) mkdir($folderLocation);
// move the file into the folder
move_uploaded_file($_FILES["myVar"]["tmp_name"], "$folderLocation/" . basename($_FILES["myVar"]["name"]));
}
Это используется для загрузки одного файла. Иногда вы можете загрузить несколько файлов. Для этого существует атрибут, он называется multiple
.
Для любого атрибута есть атрибут. Мне жаль
Ниже приведен пример формы, представляющей несколько файлов.
<form method="POST" enctype="multipart/form-data">
<input type="file" name="myVar[]" multiple="multiple" />
<input type="submit" name="Submit" />
</form>
Обратите внимание на внесенные здесь изменения; их всего лишь несколько.
- Имя
input
имеет квадратные скобки. Это потому, что теперь это массив файлов, и поэтому мы сообщаем форме, чтобы сделать массив выбранных файлов. Опущение квадратных скобок приведет к тому, что в последнем большинстве файлов будет установлено значение$_FILES["myVar"]
. - Атрибут
multiple="multiple"
. Это просто говорит браузеру, что пользователи могут выбрать несколько файлов.
$total = isset($_FILES["myVar"]) ? count($_FILES["myVar"]["name"]) : 0; // count how many files were sent
// iterate over each of the files
for ($i = 0; $i < $total; $i++)
{
// there isn't an error
if ($_FILES["myVar"]["error"][$i] == UPLOAD_ERR_OK)
{
$folderLocation = "myFiles"; // a relative path. (could be "path/to/file" for example)
// if the folder doesn't exist then make it
if (!file_exists($folderLocation)) mkdir($folderLocation);
// move the file into the folder
move_uploaded_file($_FILES["myVar"]["tmp_name"][$i], "$folderLocation/" . basename($_FILES["myVar"]["name"][$i]));
}
// else report the error
else switch ($_FILES["myVar"]["error"][$i])
{
case UPLOAD_ERR_INI_SIZE:
echo "Value: 1; The uploaded file exceeds the upload_max_filesize directive in php.ini.";
break;
case UPLOAD_ERR_FORM_SIZE:
echo "Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.";
break;
case UPLOAD_ERR_PARTIAL:
echo "Value: 3; The uploaded file was only partially uploaded.";
break;
case UPLOAD_ERR_NO_FILE:
echo "Value: 4; No file was uploaded.";
break;
case UPLOAD_ERR_NO_TMP_DIR:
echo "Value: 6; Missing a temporary folder. Introduced in PHP 5.0.3.";
break;
case UPLOAD_ERR_CANT_WRITE:
echo "Value: 7; Failed to write file to disk. Introduced in PHP 5.1.0.";
break;
case UPLOAD_ERR_EXTENSION:
echo "Value: 8; A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.";
break;
default:
echo "An unknown error has occured.";
break;
}
}
Это очень простой пример и не обрабатывает такие проблемы, как расширения файлов, которые не разрешены, или файлы с именем с кодом PHP (например, эквивалент PHP для SQL-инъекции). См. Документацию .
Первый процесс проверяет, есть ли какие-либо файлы, и если да, установите общее число из них в $total
.
Использование цикла for позволяет итерации массива $_FILES
и доступа к каждому элементу за раз. Если этот файл не сталкивается с проблемой, то оператор if является истинным и запускается код из одной загрузки файла.
Если возникла проблема, выполняется блок переключателя и отображается ошибка в соответствии с ошибкой для этой конкретной загрузки.
$_COOKIE
Ассоциативный массив переменных передается текущему скрипту через HTTP Cookies.
Куки-файлы - это переменные, которые содержат данные и хранятся на компьютере клиента.
В отличие от вышеупомянутых суперглобалов, файлы cookie должны быть созданы с помощью функции (и не назначать значение). Конвенция ниже.
setcookie("myVar", "myVal", time() + 3600);
В этом примере для файла cookie указывается имя (в этом примере это «myVar»), дается значение (в этом примере это «myVal», но переменная может быть передана для присвоения ее значения cookie), и затем дается время истечения (в этом примере это один час с 3600 секунд - минута).
Несмотря на то, что соглашение о создании cookie отличается от другого, к нему обращаются так же, как и другие.
echo $_COOKIE["myVar"]; // returns "myVal"
Чтобы уничтожить куки-файл, setcookie
нужно вызвать снова, но время истечения времени устанавливается в любое время в прошлом. Увидеть ниже.
setcookie("myVar", "", time() - 1);
var_dump($_COOKIE["myVar"]); // returns null
Это отключит файлы cookie и удалит их с клиентского компьютера.
$_SESSION
Ассоциативный массив, содержащий переменные сеанса, доступные для текущего скрипта. Дополнительную информацию о том, как это используется, см. В документации по функциям сеанса .
Сессии очень похожи на файлы cookie, за исключением того, что они являются серверными.
Чтобы использовать сеансы, вы должны включить session_start()
в верхней части своих сценариев, чтобы разрешить использование сеансов.
Установка переменной сеанса такая же, как установка любой другой переменной. См. Пример ниже.
$_SESSION["myVar"] = "myVal";
При запуске сеанса случайный идентификатор устанавливается как файл cookie и называется «PHPSESSID» и будет содержать идентификатор сеанса для этого текущего сеанса. К этому можно обратиться, вызвав функцию session_id()
.
Можно уничтожить переменные сеанса с помощью функции unset
(такой, что unset($_SESSION["myVar"])
уничтожит эту переменную).
Альтернативой является вызов session_destory()
. Это разрушит весь сеанс, означающий, что все переменные сеанса больше не будут существовать.
$_REQUEST
Ассоциативный массив, который по умолчанию содержит содержимое
$_GET
,$_POST
и$_COOKIE
.
Как указано в документации по PHP, это всего лишь сопоставление $_GET
, $_POST
и $_COOKIE
всех в одной переменной.
Поскольку для всех трех этих массивов возможно иметь индекс с тем же именем, в файле php.ini
называемом request_order
который может указать, какой из трех имеет приоритет.
Например, если он был установлен в "GPC"
, тогда будет использоваться значение $_COOKIE
, так как оно считывается слева направо, что означает, что $_REQUEST
установит значение $_GET
, затем $_POST
, а затем $_COOKIE
и поскольку $_COOKIE
является последним, это значение, которое находится в $_REQUEST
.
См. Этот вопрос .
$_ENV
Ассоциативный массив переменных передается текущему скрипту через метод среды.
Эти переменные импортируются в глобальное пространство имен PHP из среды, в которой работает парсер PHP. Многие из них предоставляются оболочкой, под которой работает PHP, и в разных системах, вероятно, используются разные типы оболочек, окончательный список невозможен. Пожалуйста, ознакомьтесь с документацией вашей оболочки для списка определенных переменных среды.
Другие переменные среды включают переменные CGI, размещенные там независимо от того, работает ли PHP в качестве серверного модуля или процессора CGI.
Все, что хранится в $_ENV
происходит из среды, из которой работает PHP.
$_ENV
только заполняется, если позволяет php.ini
.
См. Этот ответ для получения дополнительной информации о том, почему $_ENV
не заполняется.