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

Имена переменных подчиняются тем же правилам, что и другие метки в PHP. Допустимое имя переменной начинается с буквы или знака подчеркивания, за которым следует любое количество букв, цифр или знаков подчеркивания. В качестве регулярного выражения это будет выглядеть так: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var";      // outputs "Bob, Joe"

$4site = 'not yet';     // invalid; starts with a number
$_4site = 'not yet';    // valid; starts with an underscore
$täyte = 'mansikka';    // valid; 'ä' is (Extended) ASCII 228.
?>

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

PHP также предлагает другой способ присваивать значения переменным: присваивать по ссылке . Это означает, что новая переменная просто ссылается (другими словами, «становится псевдонимом» или «указывает на») на исходную переменную. Изменения новой переменной влияют на исходную, и наоборот.

Чтобы присвоить по ссылке, просто добавьте амперсанд (&) к началу присваиваемой переменной (исходной переменной). Например, следующий фрагмент кода выводит ' My name is Bob' дважды:

<?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $bar;
echo $foo;                 // $foo is altered too.
?>

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

<?php
$foo = 25;
$bar = &$foo;      // This is a valid assignment.
$bar = &(24 * 7);  // Invalid; references an unnamed expression.

function test()
{
   return 25;
}

$bar = &test();    // Invalid.
?>

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

 

Пример #1 Значения по умолчанию неинициализированных переменных

 25
var_dump($unset_int);

// Float/double usage; outputs 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);

// Array usage; outputs array(1) {  [3]=>  string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);

// Object usage; creates new stdClass object 
// Outputs: object(stdClass)#1 (1) {  ["foo"]=>  string(3) "bar" }
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>

Предопределенные переменные

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

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

Область видимости переменной

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

<?php
$a = 1;
include 'b.inc';
?>

Здесь переменная $a будет доступна во включенном скрипте b.inc . Однако в пользовательских функциях вводится локальная область действия. Любая переменная, используемая внутри функции, по умолчанию ограничена областью действия локальной функции. Например:

<?php
$a = 1; /* global scope */ 

function test()
{ 
    echo $a; /* reference to local scope variable */ 
} 

test();
?>

Этот скрипт не выдаст никакого вывода, потому что оператор echo ссылается на локальную версию переменной $a , и ей не присвоено значение в этой области. Вы можете заметить, что это немного отличается от языка C тем, что глобальные переменные в C автоматически доступны для функций, если они специально не переопределены локальным определением. Это может вызвать некоторые проблемы, поскольку люди могут непреднамеренно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.

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

Во-первых, пример использования global:

 

Пример #1 Использованиеglobal

<?php
$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo $b;
?>

Приведенный выше скрипт выведет 3. Объявляя $a и $b глобальными внутри функции, все ссылки на любую переменную будут ссылаться на глобальную версию. Нет ограничений на количество глобальных переменных, которыми может манипулировать функция.

Второй способ доступа к переменным из глобальной области видимости — использование специального массива $GLOBALS , определенного в PHP. Предыдущий пример можно переписать так:

 

Пример #2 Использование $GLOBALS вместо global

<?php
$a = 1;
$b = 2;

function Sum()
{
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
} 

Sum();
echo $b;
?>

Массив $GLOBALS — это ассоциативный массив, в котором имя глобальной переменной является ключом, а содержимое этой переменной — значением элемента массива. Обратите внимание, что $GLOBALS существует в любой области видимости, потому что $GLOBALS является суперглобальным . Вот пример, демонстрирующий силу суперглобальных переменных:

 

Example #3 Пример, демонстрирующий суперглобальные переменные и область видимости

<?php
function test_superglobal()
{
    echo $_POST['name'];
}
?>

Примечание :

Использование globalключевого слова вне функции не является ошибкой. Его можно использовать, если файл включается из функции.

Использование staticпеременных

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

Example #4 Пример, демонстрирующий потребность в статических переменных

<?php
function test()
{
    $a = 0;
    echo $a;
    $a++;
}
?>

Эта функция совершенно бесполезна, так как каждый раз, когда она вызывается, она устанавливает $a в 0и печатает 0. $a ++, который увеличивает переменную, не имеет смысла, поскольку, как только функция завершает работу , переменная $a исчезает. Чтобы сделать полезную функцию подсчета, которая не потеряет текущий счет, переменная $a объявлена ​​статической:

Пример #5 Пример использования статических переменных

<?php
function test()
{
    static $a = 0;
    echo $a;
    $a++;
}
?>

Теперь $a инициализируется только при первом вызове функции, и каждый раз, когда test()функция вызывается, она будет печатать значение $a и увеличивать его.

Статические переменные также предоставляют один из способов работы с рекурсивными функциями. Рекурсивная функция — это та, которая вызывает сама себя. Следует соблюдать осторожность при написании рекурсивной функции, поскольку ее можно сделать бесконечно рекурсивной. Вы должны убедиться, что у вас есть адекватный способ завершения рекурсии. Следующая простая функция рекурсивно считает до 10, используя статическую переменную $count , чтобы знать, когда остановиться:

Пример #6 Статические переменные с рекурсивными функциями

<?php
function test()
{
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        test();
    }
    $count--;
}
?>

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

Пример #7 Объявление статических переменных

<?php
function foo(){
    static $int = 0;          // correct 
    static $int = 1+2;        // correct
    static $int = sqrt(121);  // wrong  (as it is a function)

    $int++;
    echo $int;
}
?>

Примечание :

Статические объявления разрешаются во время компиляции.

Ссылки с переменными globalи static

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

<?php
function test_global_ref() {
    global $obj;
    $new = new stdclass;
    $obj = &$new;
}

function test_global_noref() {
    global $obj;
    $new = new stdclass;
    $obj = $new;
}

test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>

Приведенный выше пример выведет:

НУЛЕВОЙ
объект (стандартный класс) # 1 (0) {
}

Аналогичное поведение применимо к staticоператору. Ссылки не хранятся статически:

<?php
function &get_instance_ref() {
    static $obj;

    echo 'Static object: ';
    var_dump($obj);
    if (!isset($obj)) {
        $new = new stdclass;
        // Assign a reference to the static variable
        $obj = &$new;
    }
    if (!isset($obj->property)) {
        $obj->property = 1;
    } else {
        $obj->property++;
    }
    return $obj;
}

function &get_instance_noref() {
    static $obj;

    echo 'Static object: ';
    var_dump($obj);
    if (!isset($obj)) {
        $new = new stdclass;
        // Assign the object to the static variable
        $obj = $new;
    }
    if (!isset($obj->property)) {
        $obj->property = 1;
    } else {
        $obj->property++;
    }
    return $obj;
}

$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>

Приведенный выше пример выведет:

Статический объект: NULL
Статический объект: NULL

Статический объект: NULL
Статический объект: object(stdClass)#3 (1) {
  ["свойство"]=>
  интервал (1)
}

Этот пример демонстрирует, что при присвоении ссылки статической переменной она не запоминается при &get_instance_ref()повторном вызове функции.

Переменные переменных

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

<?php
$a = 'hello';
?>

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

<?php
$$a = 'world';
?>

На данный момент две переменные определены и сохранены в дереве символов PHP: $a с содержимым "hello" и $hello с содержимым "world". Следовательно, это утверждение:

<?php
echo "$a ${$a}";
?>

производит точно такой же вывод, как:

<?php
echo "$a $hello";
?>

т.е. они оба производят: привет мир .

Чтобы использовать переменные-переменные с массивами, вы должны решить проблему неоднозначности. То есть, если вы пишете $$a[1] , то синтаксический анализатор должен знать, хотели ли вы использовать $a[1] в качестве переменной, или вы хотели $$a в качестве переменной, а затем индекс [1] из эта переменная. Синтаксис для разрешения этой неоднозначности: ${$a[1]} для первого случая и ${$a}[1] для второго.

Доступ к свойствам класса также можно получить, используя имена переменных свойств. Имя свойства переменной будет разрешено в пределах области, из которой сделан вызов. Например, если у вас есть такое выражение, как $foo->$bar , то локальная область видимости будет проверяться на наличие $bar и его значение будет использоваться как имя свойства $foo . Это также верно, если $bar является доступом к массиву.

Можно также использовать фигурные скобки, чтобы четко разграничить имя свойства. Они наиболее полезны при доступе к значениям в свойстве, содержащем массив, когда имя свойства состоит из нескольких частей или когда имя свойства содержит символы, которые в противном случае недействительны (например, из json_decode() или SimpleXML ).

Пример #1 Пример свойства переменной

<?php
class foo {
    var $bar = 'I am bar.';
    var $arr = array('I am A.', 'I am B.', 'I am C.');
    var $r   = 'I am r.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->{$baz[1]} . "\n";

$start = 'b';
$end   = 'ar';
echo $foo->{$start . $end} . "\n";

$arr = 'arr';
echo $foo->{$arr[1]} . "\n";

?>

Приведенный выше пример выведет:


я бар.
я бар.
я бар.
я р.

HTML-формы (GET и POST)

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

 

Пример #1 Простая HTML-форма

<form action="foo.php" method="post">
    Имя: <input type="text" name="username" /><br />
    Электронная почта: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Отправить мне!" />
</форма>

Есть только два способа доступа к данным из ваших HTML-форм. Доступные в настоящее время методы перечислены ниже:

 

Пример #2 Доступ к данным из простой HTML-формы POST

<?php
echo $_POST['username'];
echo $_REQUEST['username'];
?>

Использование формы GET похоже, за исключением того, что вместо этого вы будете использовать соответствующую предопределенную переменную GET. GET также применяется к QUERY_STRING(информация после '?' в URL-адресе). Так, например, http://www.example.com/test.php?id=3 содержит данные GET, которые доступны с помощью $_GET['id'] . См. также $_REQUEST .

Примечание :

Точки и пробелы в именах переменных преобразуются в символы подчеркивания. Например <input name="a.b" />становится $_REQUEST["a_b"].

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

 

Пример #3 Более сложные переменные формы

<?php
if ($_POST) {
    echo '<pre>';
    echo htmlspecialchars(print_r($_POST, true));
    echo '</pre>';
}
?>
<form action="" method="post">
    Name:  <input type="text" name="personal[name]" /><br />
    Email: <input type="text" name="personal[email]" /><br />
    Beer: <br />
    <select multiple name="beer[]">
        <option value="warthog">Warthog</option>
        <option value="guinness">Guinness</option>
        <option value="stuttgarter">Stuttgarter Schwabenbräu</option>
    </select><br />
    <input type="submit" value="submit me!" />
</form>

Примечание . Если имя внешней переменной начинается с допустимого синтаксиса массива, завершающие символы игнорируются. Например, <input name="foo[bar]baz"> становится $_REQUEST['foo']['bar'].

Имена переменных IMAGE SUBMIT

При отправке формы можно использовать изображение вместо стандартной кнопки отправки с тегом вида:

<input type="image" src="image.gif" name="sub" />

Когда пользователь щелкнет где-нибудь на изображении, на сервер будет передана сопроводительная форма с двумя дополнительными переменными, sub_x и sub_y . Они содержат координаты клика пользователя на изображении. Опытные могут заметить, что фактические имена переменных, отправленные браузером, содержат точку, а не подчеркивание, но PHP автоматически преобразует точку в подчеркивание.

Файлы cookie HTTP

PHP прозрачно поддерживает файлы cookie HTTP, как определено в » RFC 6265 . Файлы cookie — это механизм для хранения данных в удаленном браузере и, таким образом, отслеживания или идентификации вернувшихся пользователей. Вы можете установить файлы cookie с помощью функции setcookie() . Файлы cookie являются частью заголовка HTTP, поэтому функция SetCookie должна быть вызвана до того, как какие-либо выходные данные будут отправлены в браузер. Это то же ограничение, что и для функции header() . Затем данные cookie доступны в соответствующих массивах данных cookie, таких как $_COOKIE , а также в $_REQUEST . См . справочную страницу setcookie() для более подробной информации и примеров.

Примечание . Начиная с PHP 7.2.34, 7.3.23 и 7.4.11, соответственно, имена входящих файлов cookie больше не декодируются по URL-адресу из соображений безопасности.

Если вы хотите присвоить несколько значений одной переменной cookie, вы можете присвоить ее как массив. Например:

<?php
  setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
  setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>

Это создаст два отдельных файла cookie, хотя MyCookie теперь будет одним массивом в вашем скрипте. Если вы хотите установить только один файл cookie с несколькими значениями, подумайте о том, чтобы сначала использовать serialize() или взорвать() значение.

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

Пример #4 Пример setcookie ()

<?php
if (isset($_COOKIE['count'])) {
    $count = $_COOKIE['count'] + 1;
} else {
    $count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>

Точки в именах входящих переменных

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

<?php
$varname.ext;  /* invalid variable name */
?>

Теперь синтаксический анализатор видит переменную с именем $varname , за которой следует оператор конкатенации строк, за которым следует строка без кавычек (т.е. строка без кавычек, которая не соответствует ни одному известному ключу или зарезервированным словам) 'ext'. Очевидно, что это не имеет ожидаемого результата.

По этой причине важно отметить, что PHP автоматически заменяет любые точки во входящих именах переменных символами подчеркивания.

Определение типов переменных

Поскольку PHP определяет типы переменных и преобразует их (как правило) по мере необходимости, не всегда очевидно, к какому типу относится данная переменная в любой момент времени. В PHP есть несколько функций, которые определяют тип переменной, например: gettype() , is_array() , is_float() , is_int() , is_object() и is_string() . См. также главу о типах .

Поскольку HTTP является текстовым протоколом, большая часть, если не весь контент, поступающий в массивы Superglobal , такие как $_POST и $_GET , останется в виде строк. PHP не будет пытаться преобразовывать значения в определенный тип. В приведенном ниже примере $_GET["var1"] будет содержать строку "null" и $_GET["var2"] строку "123".

/index.php?var1=null&var2=123