ProfiPHPProfiPHP
  1. Главная
  2. Самоучитель PHP 7
  3. Переменные и типы данных в PHP

Переменные и типы данных в PHP

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

Объявление переменной


В языке программирования РНР все переменные начинаются со знака доллара ($), за которым может быть любое количество буквенно-цифровых символов и символов подчеркивания. Следует также заметить, что первый символ не может быть цифрой и имена переменных чувствительны к регистру.
<?php
$color = "Желтый";
$Color = "Зеленый";

echo $color; // Желтый
echo $Color; // Зеленый
Инициализировать переменную и присвоить ей значения можно с помощью оператора присваивания "=". Также допускается инициализация одним значением сразу нескольких переменных за счет того, что оператор присваивания возвращает результат присвоения. Например:
<?php
$color = $Color = "Желтый";
echo $color; // Желтый
echo $Color; // Желтый

Типы данных


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

Также встречаются и псевдотипы - условные обозначения одного или нескольких типов. В основном они используются совместно функциями и методами. Например, mixed - любой тип, number - может хранить значения типа integer или double, iterable - итерируемый объект. Ключевое слово void обозначает отсутствие переменной. Несколько типов могут быть разделены вертикальной чертой, что аналогично логичной операции «или». Например, псевдотип number можно записать, используя следующую комбинацию базовых типов: integer|double.

Опишем основные типы данных, которые поддерживаются РНР:

Integer. Целое число, максимальное значение которого зависит от разрядности операционной системы. В случае 32-битной операционной системы число может принимать значения от -2 147 483 648 до 2 147 483 647. Если разрядность составляет 64 бита, диапазон возможных значений от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.

Double|Float. Вещественное число, минимально возможное значение которого составляет от ±2.23х10-308 степени до ±1.79х10308.

Boolean. Логический тип, способный принимать лишь два значения: True (истина) и False (ложь).

String. Строковый тип. Может хранить строку, максимальный размер которой составляет 2 Гбайт.

Array. Массив. Это объединение нескольких переменных под одним именем, обращаться к отдельным переменным которых можно при помощи индекса массива.

Object. Объект. Это конструкция, объединяющая несколько разнотипных переменных и методы их обработки.

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

Null. Специальный тип, который сигнализирует о том, что переменная не была инициализирована.

Callable|Callback. Некоторые функции РНР могут принимать в качестве аргументов другие функции, которые называются функциями обратного вызова. Переменные данного типа содержат ссылки на такие функции.

Целые числа


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

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

Объявление целочисленных переменных может осуществляться несколькими способами:
<?php
$num = 123; // десятичное число
$num = +123; // десятичное число
$num = -123; // отрицательное число
$num = 012; // восьмеричное число (эквивалентно 10)
$num = 0xA; // шестнадцатеричное число (эквивалентно 10)
Положительное целое число объявляется без указания перед ним знака плюс. Для объявления отрицательного числа необходимо перед ним указать символ минуса. По умолчанию числа задаются в десятичной системе счисления, однако в РНР можно объявлять переменные в восьмеричной и шестнадцатеричной системах счисления. Более подробно о целых числах и системах счисления можно узнать из статьи Целые числа (Integer)

Вещественные числа


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

При выводе под число с плавающей точкой отводится 12 символов, это значение может быть изменено при помощи директивы Precision в конфиrурационном файле php.ini.

Объявление вещественных чисел:
<?php
// Стандартная запись
$var = 1.23456;
// Экспоненциальная запись.
$var = 1.23456E2; // 123.456
Более подробно о вещественных числах можно узнать из статьи Числа с плавающей точкой (Float)

Логический тип


Переменные логического типа Boolean принимают только два значения: True (истина) или False (ложь). Константы True и False не зависят от регистра, но следуя стандартам написания кода PSR-2, рекомендуется писать строчными буквами: true и false. В большинстве случаев переменные логического типа используются совместно с операторами сравнения и цикла. Более подробно о логическом типе можно узнать из статьи Двоичные данные (Boolean).

Строки


Строки предназначены для хранения текстовой информации и могут достигать размера 2 Гбайт. Однако на максимальный объем строки так же влияет ограничение объема памяти, отводимой под РНР-скрипт. Объем памяти определяется при помощи директивы Memory_limit конфигурационного файла php.ini. Объявление строк осуществляется при помощи кавычек:
<?php
$str = "Hello, World!";

Кавычки


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

Двойные кавычки ("...") позволяют вместо переменных РНР подставлять их значения. Такая подстановка называется интерполяцией.
<?php
$str = "Hello, world!";
echo "Значение переменной - $str"; // Значение переменной - Hello, world!
Одиночные кавычки ('...') не позволяют подставлять значение переменных.

Значение, заключенное в обратные кавычки (`...`), рассматривается как системная команда. Вместо такой системной команды возвращается результат выполнения команды:
<?php
echo `dir`;

// Volume in drive C has no label.
// Volume Serial Number is FE44-B92A

// Directory of C:\localhost\profiphp

// 30.05.2019 15:47 <DIR> .
// 30.05.2019 15:47 <DIR> ..
// 23.05.2019 12:27 13 753 .htaccess
// 31.05.2019 15:11 1 083 index.php
В языках программирования обычно поддерживаются два варианта кавычек: одиночные и двойные, для того чтобы при необходимости применять одиночные кавычки для обрамления двойных, а двойные - для обрамления одиночных. Более детально можно узнать из статьи Разница между двойными и одинарными кавычками в PHP.
<?php
echo "Переменная принимает значение 'abc'";
echo 'Самоучитель "PHP 7"';
Иногда при использовании двойных кавычек необходимо подавить подстановку значений переменной. Для этого применяется экранирование символа $ обратным слешем \:
<?php
$str = "Hello, world!";
echo "Значение переменной - \$str"; // Значение переменной - $str
Аналогично экранирование применяется и для размещения двойных кавычек в строке, обрамленной двойными же кавычками.

Применение обратного слеша с рядом другими символами интерпретируется особым образом. Наиболее часто используются символы перевода строки (\n), возврат каретки (\r), символ табуляции (\t), обратный слеш (\\), двойная (\") и одинарная кавычка (\'). Размещение переменных и специальных символов (за исключением \') в одиночных кавычках не приводит к их специальной интерпретации.

Хорошим тоном является указание границ переменной внутри строки обрамлением фигурными скобками ({...}):
<?php
$str = "Hello, world!";
echo "Значение переменной - {$str}"; // Значение переменной - Hello, world!

Оператор <<<


Объявить строку можно также используя оператор <<<, который еще называют встроенным документом (hеrе-документ). Сразу после данной последовательности размещается метка, конец оператора обозначается повторным вхождением метки. Метка является зависимой от регистра, но традиционно вводится при помощи заглавных букв.
<?php
$str = <<< EOT
До тех пор, пока не встретится
метка, можно писать все что угодно
EOT;
echo $str;
После первой метки EOT не должно быть пробелов, лишь перевод строки, как, впрочем, и перед последней меткой EOT. Последовательность <<< традиционно применяют для ввода объемного текста, который неудобно вводить при помощи традиционных кавычек.

Маркер можно заключать в одинарные кавычки, которые сообщают интерпретатору РНР, что переменные внутри такой строки не интерполируются.
<?php
$str = "Hello, world!";
$str = <<< 'EOT'
До тех пор, пока не встретится
метка, можно писать все что угодно $str
EOT;
echo $str;
Результат выполнения:
До тех пор, пока не встретится
метка, можно писать все что угодно $str

Неинициализированные переменные


В языке программирования РНР переменная создается сразу же при первом обращении. Если она не была инициализирована при помощи оператора присваивания =, генерируется замечание (Notice):
<?php
echo $city;
// Notice: Undefined variable: city in test.php on line 2
В результате обращения к неинициализированной переменной генерируется замечание о неопределенной переменной.

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

Специальный тип Null


Для пометки неинициализированной переменной предназначен специальный тип Null. Переменная также получает данный тип, если она инициализируется константой типа Null или уничтожается при помощи конструкции Unset.

Константа Null не зависит от регистра. Однако, необходимо придерживаться стандарта PSR-2 и записывать ее в строчном виде.
<?php
$city = null;
Следует отметить, что при инициализации переменной при помощи константы null и последующем обращении к переменной в выражениях генерации замечания "Notice: Undefined variable" не происходит.

Уничтожение переменной


Для уничтожения переменной можно воспользоваться конструкцией Unset. В параметрах конструкции указывается либо одна, либо несколько разделенных запятыми переменных, которые подлежат уничтожению. После вызова данной конструкции память, выделенная под значение переменной, возвращается системе, а самой переменной присваивается значение null.
<?php
// Объявляем переменную
$city = "Kiev";
// Уничтожаем
unset($city);
// Попытка обращения к несуществующей переменной
echo $city; // Генерируется "Notice: Undefined variable"
Уничтожение ненужных переменных может быть полезно, когда скрипт оперирует объемными данными (например, содержимым файлов), и их размер грозит превысить объем памяти, выделяемой скрипту.

Проверка существования переменной


Для проверки существования переменной используется конструкция Isset, в параметрах которой указывается либо одна, либо несколько разделенных запятыми переменных. В отличие от конструкции Unset, здесь возвращается значение логического типа. Если все переменные существуют, конструкция возвращает True, если хотя бы одна переменная не существует - возвращается False.
<?php
// Объявляем пустую переменную
$str = '';
if (isset($str)) { // true
echo 'Переменная $str существует';
}
// Помечаем переменную $str как неинициализированную
$str = null;
if (isset($str)) { // false
echo 'Переменная $str существует';
}
Как видно из примера, пустая строка не эквивалентна неинициализированной переменной. Для проверки, является ли строка пустой или нет, предназначена специальная конструкция Empty, которая принимает в качестве параметра лишь одну переменную и возвращает True, если переменная равна пустой строке "", нулю 0, символу нуля в строке "0", null, false, пустому массиву array(), неинициализированной переменной. Во всех остальных случаях возвращается False.

Определение типа переменной


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

Универсальной функцией, позволяющей определить тип переменной, является функция Var_dump, которая выводит информацию о переменной. Возвращаемое значение может принимать одно из значений: "boolean", "integer'', "double", "string", "array", "object", "resource", "null" и "unknown type":
<?php
// Объявляем целую переменную:
$number = 123;
echo var_dump($number); // int(123)

// Объявляем логическую переменную:
$flag = true;
echo var_dump($flag); // bool(true)

// Объявляем строковую переменную:
$str = '';
echo var_dump($str); // string(0) ""

// Объявляем вещественную переменную:
$var = 1.7;
echo var_dump($var); // float(1.7)

// Уничтожаем переменную $var:
unset($var);
echo var_dump($var); // Notice: Undefined variable (null)
Для каждого из типов предназначена функция, начинающаяся с префикса is_, которая возвращает True, если переменная принадлежит заданному типу. Например, функция функция Is_int проверяет, является ли переменная целочисленного типа Integer:
<?php
// Объявляем целую переменную
$number = 12345;
if (is_int($number)) { // true
echo 'Переменная $number является целочисленной';
}
// Объявляем строковую переменную
$str = '12345';
if (is_int($str)) { // false
echo 'Переменная $str является целочисленной';
}
Результат примера будет вывод одной строки, поскольку только $number является целочисленной переменной. Переменная $str, несмотря на то что содержит число, содержит строковый тип, поэтому функция Is_int возвращает для нее False.

В отличие от других языков программирования, где типы float и double имеют разный размер допустимых значений, в РНР между ними не существует различий. Функция Var_dump возвращает значение float для всех вещественных чисел, не зависимо от того, имеют они тип float или double:
<?php
$float = 123.24;
var_dump($float); // float(123.24)

$double = 123.24e307; // float(INF)
var_dump($double);

Неявное приведение типов


В языках программирования, которым свойственный серьезный подход к типизации данных, при объявлении переменной следует обязательно указывать ее тип, иначе программа приведет к ошибке. PHP относится к слабо типизированным языкам, поэтому от программиста не требуется явное указание типа переменной, а попытка использования ее в контексте, где ожидается переменная другого типа, приведет к попытке автоматического (неявного) преобразования переменной к нужному типу. Например, если строка содержит число и используется в арифметическом выражении, то она автоматически будет приведена к числовому типу:
<?php
$str = '36.6';
$number = 1 + $str;
echo $number; // 37.6
Интерпретатор РНР извлекает из начала строки наиболее полное значение, соответствующее числу. Если извлечь число из строки не удается, ее значение рассматривается как нулевое:
<?php
echo '12abc23' + 1; // 12 + 1 = 13
echo 1 + 'два'; // 1 + 0 = 1
Данный код выполнится с примечанием "Notice: A non well formed numeric value encountered", которое предупреждает, что обнаружено неверно сформированное числовое значение.

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

В логический тип False автоматически приводятся все значения равные нулю "0", пустая строка "", строка, содержащая "0", пустые массивы и объекты, а также null, все остальные переменные рассматриваются как True.
<?php
$int = 0;
if ($int) { // false
echo 'Переменная $int рассматривается как true';
}
$str = "Hello, World!";
if ($str) { // true
echo 'Переменная $str рассматривается как true';
}
При преобразовании логического типа к строке, True превращается в "1", а False в пустую строку "". Преобразование логического типа к числу приводит к превращению True в 1, а False в 0. Поэтому True всегда выводится как единица, а False как пустая строка.

Явное приведение типов


В РНР можно явно преобразовать переменную в один из поддерживаемых типов. Одним из вариантов преобразования заключается использование круглых скобок. В них указывается тип, к которому следует привести переменную.
<?php
$float = 1.23; // float(1.23)
$number = (int)$float; // int(1)
Приведем все возможные варианты использования оператора круглых скобок: (int|integer) - приведение к целому типу int; (bool|boolean) - приведение к логическому типу boolean; (float|double|real) - приведение к вещественному типу double; (string) - приведение к строковому типу string; (array) - приведение к массиву; (object) - приведение к объекту.

Помимо оператора круглых скобок, РНР предоставляет ряд специальных функций, позволяющих осуществить преобразование типа переменной. Функция Settype преобразует тип переменной в необходимый. Для этого в параметрах указывается название переменной и новый тип данных, который может принимать одно из следующих значений: "boolean" или "bool", "integer" или "int", "float" или "double", "string", "array", "object", "null". Функция возвращает True, если преобразование было успешно осуществлено, и False в противном случае.
<?php
// Объявляем строковую переменную
$str = '5abc';
// Приводим строку к целому числу
settype($str, 'integer'); // int(5)
Функция Settype возвращает логическое значение, а не результат преобразования. На практике, если в явном преобразовании возникает необходимость, гораздо удобнее пользоваться специализированными функциями: Floatval, Intval и Strval.

Динамические переменные


В PHP можно создавать переменные произвольного типа, для этого необходимо использовать двойной символ $$. Иногда название переменной невозможно определить заранее, и оно должно определяться по мере выполнения скрипта. В этом случае прибегают к динамическим переменным.
<?php
$id_menu = 10;
$str = "active$id_menu"; // "active10"
$$str = 1; // $active10 = 1;
if (isset($active10)) {
echo "Переменная \${$str} существует и равна $active10";
}
Значение переменной, следующей после первого знака $, воспринимается как имя новой переменной. В результате если строка $str имеет значение "active10", то имя новой переменной будет $active10.

Еще один способ создания динамических переменных заключается в использовании функции Eval. Она принимает в качестве параметра строку с РНР-кодом и выполняет ее:
<?php
$str = '$num = "10";
echo $num;';
eval($str); // 10
В результате выполнения скрипта из листинга в окно браузера будут выведено число 10. Таким образом, переменная $num, которая определена в строке $str, доступна не только в пределах данной строки, но и после выполнения функции Eval.

Ссылки на переменные


Для создания ссылок используется оператор &:
<?php
$first = 5;
$second = &$first;
$second = 1;
echo $first; // 1
Как видно из примера, если перед именем переменной использовать оператор &, то другая переменная становится ссылкой. Оба названия переменных выступают как синонимы.

Добавить комментарий

Имя:
Текст комментария: