2.5 Переменные, константы, типы данных

Возможно, вы заметили, структура PHP-программы весьма напоминает смесь языков Basic и C, да еще с включениями на HTML. Что ж, так оно, в общем, и есть. Однако в предыдущей главе мы рассмотрели лишь очень простой пример программы на PHP, поэтому вряд ли сможем сейчас увидеть общую картину языка. Теперь настало время заняться конструкциями PHP вплотную.
Начнем мы с основ языка. Итак…

Переменные
Как и в любом другом языке программирования (за исключением, может быть, языка Forth), в PHP существует такое понятие, как переменная. Даже в простом примере, который был описан в предыдущей главе, мы использовали 3 переменные!
При программировании на PHP принято не скупиться на объявление новых переменных, даже если можно обойтись и без них. Например, в том простом сценарии мы вполне могли бы использовать всего одну переменную — счетчик цикла. Однако сценарий будет значительно читабельнее, если определить несколько переменных. Это связано с тем, что создание нового идентификатора интерпретатору обходится довольно “дешево”. Имена переменных чувствительны к регистру букв: например, $my_variable — не то же самое, что $My_Variable или $MY_VARIABLE. Кроме того, имена всех переменных должны начинаться со знака $ — так интерпретатору значительно легче “понять” и отличить их, например, в строках. Поначалу это довольно сильно раздражает, но потом привыкаешь (и даже автоматически начинаешь писать “доллары” перед именами переменных в программах на других языках).

Копирование переменных
Переменные в PHP — особые объекты, которые могут содержать в буквальном смысле все, что угодно. Если в программе что-то хранится, то оно всегда хранится в переменной (исключение — константа, которая, впрочем, может содержать только число, строку, а начиная с PHP 7 — массив). Такого понятия, как указатель (как в C), в языке не существует — при присваивании переменная в большинстве случаев копируется один в один, какую бы сложную структуру она ни имела. Единственное исключение из этого правила — копирование переменной, ссылающейся на объект или массив: в этом случае объект остается в единственном экземпляре, копируется лишь ссылка на него…

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

Типы переменных
PHP непосредственно поддерживает несколько типов переменных, которые мы перечислим и коротко опишем. Забегая вперед заметим, что тип переменной можно узнать при помощи вызова функции gettype($variable), которая примет значение, равное имени типа в строковом представлении.

PHP поддерживает восемь простых типов данных (переменных):

Четыре скалярных типа:

  • boolean (двоичные данные)
  • integer (целые числа)
  • float (числа с плавающей точкой или ‘doble’)
  • string (строки)

Два смешанных типа:

  • array (массивы)
  • object (объекты)

И два специальных типа:

  • resource (ресурсы)
  • NULL (“пустой” тип)

Существуют также несколько псевдотипов:

  • mixed (смешанный)
  • number (числовой)
  • callback (обратного вызова)

Проверка существования
Можно проверить, существует ли (т. е. инициализирована ли) указанная переменная. Выполняется это при помощи встроенной в PHP конструкции isset(). Например:
if (isset($my_var))
echo “Такая переменная есть. Ее значение $my_var”;

Уничтожение
Уничтожение переменной реализуется оператором unset(). После этого переменная удаляется из внутренних таблиц интерпретатора, т. е. программа начинает выполняться так, как будто переменная еще не была инициализирована. Например:
unset($a);
// Теперь переменная $a опять не существует

Определение типа переменной
Кроме описанных действий существуют еще несколько стандартных функций, которые занимаются определением типа переменных и часто включаются в условные операторы.
is_int($a)
Возвращает true, если $a — целое число.
is_double($a)
Возвращает true, если $a — действительное число.
is_infinite($a)
Возвращает true, если $a — бесконечное действительное число INF.
is_nan($a)
Возвращает true, если $a — не допустимое числовое значение NAN.
is_string($a)
Возвращает true, если $a является строкой.
is_numeric($a)
Возвращает true, если $a является либо числом, либо строковым представлением числа (т. е. состоит из цифр и точки). Рекомендуется использовать данную функцию вместо is_integer() и is_double(), потому что над числами, содержащимися в строках, можно выполнять обычные арифметические операции.

Важно помнить, что мы не можем использовать неинициализированную переменную в программе — иначе это породит предупреждение со стороны интерпретатора (что, скорее всего, свидетельствует о наличии логической ошибки в сценарии). Конечно, предупреждения можно выключить, тогда все неинициализированные переменные будут полагаться равными пустой строке. Однако мы категорически не советуем вам этого делать — уж лучше лишняя проверка присутствия в коде, чем дополнительная возня с “отлавливанием” потенциальной ошибки в будущем. Если вы все же захотите отключить это злополучное предупреждение (а заодно и все остальные), лучше использовать оператор отключения ошибок @, который действует локально.

Константы
Встречаются случаи, когда значения некоторых величин не меняются в течение работы программы. Это могут быть математические константы, пути к файлам, разнообразные пароли и т. д. Как раз для этих целей в PHP предусмотрена такая конструкция, как константа.
Константа отличается от переменной тем, что, во-первых, ей нигде в программе нельзя присвоить значение больше одного раза, а во-вторых, ее имя не предваряется знаком $, как это делается для переменных. Например:
// Предположим, определена константа PI, равная 3.1416…
$a = 2.34 * sin(3 * PI / 8) + 5; // использование константы
echo “Это число PI”; // выведет “Это число PI”
echo “Это число “.PI; // выведет “Это число 3.1416…”

Хорошо, конечно, что не надо писать “доллар” перед именем константы. Однако, как видно из примера, есть и недостаток: мы уже не можем использовать имя константы непосредственно в текстовой строке. Имя константы зависит от регистра, поэтому константы PI и pi — это разные константы.

Предопределенные константы
Константы бывают двух типов: одни — предопределенные (т. е. устанавливаемые самим интерпретатором), а другие определяются программистом. Мы уже пользовались ранее в главе предопределенными константами PHP_INT_MAX и PHP_INT_SIZE, которые определяют максимальный размер и количество байтов, отводи-
мых под целое число.
Существует несколько предопределенных констант.
 __FILE__
Хранит имя файла, в котором расположен запущенный в настоящий момент код.
__LINE__
Содержит текущий номер строки, которую обрабатывает в текущий момент интер-
претатор. Эта своеобразная “константа” каждый раз меняется по ходу исполнения
программы. (Впрочем, __FILE__ также меняется, если мы передаем управление
в другой файл.)
__FUNCTION__
Имя текущей функции.
__CLASS__
Имя текущего класса.
PHP_VERSION
Версия интерпретатора PHP.
PHP_OS
Имя операционной системы, под управлением которой работает PHP.
PHP_EOL
Символ конца строки, используемый на текущей платформе: \n для Linux, \r\n для Windows и \n\r для Mac OS X.
true или TRUE
Эта константа нам уже знакома и содержит значение “истина”.
false или FALSE
Содержит значение “ложь”.
null или NULL
Содержит значение null.

Определение констант
Вы можете определить и собственные, новые константы. Делается это при помощи конструкции define(), очень похожей на функцию. Вот как она выглядит (заодно мы попрактикуемся в наших условных обозначениях для описания синтаксиса вызова функции).
void define(string $name, string $value, bool $case_sen = true);

Например:
define(“pi”, 3.14);
define(“str”, “Test string”);
echo sin(pi / 4);
echo str;

Константы с динамическими именами
Иногда возникает ситуация, когда имя константы формируется динамически в ходе выполнения программы, поэтому нельзя заранее предугадать ее имя и жестко задать в теле скрипта.
// Получаем значение константы
<?php ## Константа с динамическим именем.
// Формируем случайное число от 1 до 10
$index = mt_rand(1, 10);
// Формируем имя константы
$name = “VALUE{$index}”;
// Определяем константу с динамическим именем
define($name, 1);
cho constant($name);
?>

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

string print_r(mixed $expression, bool $return = false) 
Эта функция, пожалуй, самая простая. Она принимает на вход некоторую переменную (или выражение) и распечатывает ее отладочное представление. Вот пример из документации:
$a = array(‘a’=>’apple’, ‘b’=>’banana’, ‘c’=>array(‘x’, ‘y’, ‘z’));
echo “<pre>”; print_r ($a); echo “</pre>”;
Результатом работы этой программы будет следующий текст:
Array
(
[a] => apple
[b] => banana
[c] => Array
(
[0] => x
[1] => y
[2] => z
)
)
В случае если параметр $return указан и равен true, функция ничего не печатает в браузер. Вместо этого она возвращает сформированное отладочное представление в виде строки. Это же относится и к двум остальным функциям.
string var_dump(mixed $expression, bool $return = false)
Данная функция печатает не только значения переменных и массивов, но также и информацию об их типах. Выглядит ее вызов точно так же:
$a = array(1, array (“a”, “b”));
echo “<pre>”; var_dump($a); echo “</pre>”;
Результат работы:
array(2) {
[0]=>
int(1)
[1]=>
array(2) {
[0]=>
string(1) “a”
[1]=>
string(1) “b”
}
}
При отладке такое представление иногда оказывается весьма полезным.

string var_export(mixed $expression, bool $return = false)
Эта функция очень напоминает print_r(), но только она выводит значение переменной так, что оно может быть использовано прямо как “кусок” PHP-программы.

<?php ## Использование var_export().
class SomeClass
{
private $x = 100;
}
$a = array(1, array (“Programs hacking programs. Why?”, “д’Артаньян”));
echo “<pre>”; var_export($a); echo “</pre>”;
$obj = new SomeClass();
echo “<pre>”; var_export($obj); echo “</pre>”;
?>

Результат работы этого скрипта:
array (
0 => 1,
1 =>
array (
0 => ‘Programs hacking programs. Why?’,
1 => ‘д\’Артаньян’,
),
)
Обратите внимание на две детали. Во-первых, функция корректно обрабатывает апострофы внутри значений переменных — она добавляет обратный слеш перед ними, что-бы результат работы оказался корректным кодом на PHP. Во-вторых, для объектов функция создает описание всех свойств класса, в том числе и закрытых (private).

 

Залишити відповідь