Типы переменных

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

Типы данных РНР

РНР поддерживает следующие базовые типы данных.

Integer (целый) — используется для представления целых чисел.

Float, также называемый double (двойной точности) — используется для представления действительных чисел.

String (строковый) — используется для представления строк символов.

Boolean (булевский) — используется для хранения значений true (истина) и false (ложь).

Array (массив) — используется для хранения нескольких элементов данных.

Object (объект) — используется для хранения экземпляров классов.

Доступны также и два специальных типа — NULL и resource (ресурс). Переменные, которым не присвоены конкретные значения, которые не определены или принимают значение NULL, относятся к типу NULL. Некоторые встроенные функции (такие как функции работы с базами данных) возвращают переменные ресурсного типа. Такие переменные представляют внешние ресурсы (например, соединения с базами данных). Можно с достаточной уверенностью утверждать, что напрямую манипулировать переменными ресурсного типа вам не придется, тем не менее, они часто возвращаются одними функциями и передаются в качестве параметров в другие функции.

Степень типизации

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

Например, при создании переменных $totalqty и $totalamount их начальные типы были определены следующим образом:

$totalqty = 0;

$totalamount =0.00;

Поскольку переменной $totalqty было присвоено целочисленное значение 0, эта переменная теперь имеет тип integer. Аналогично, переменная $totalamount имеет тип float.

Также в сценарий вполне можно поместить такую строку:

$totalamount = 'Добро пожаловать';

Теперь переменная $totalamount имеет тип string. РНР в любой момент времени изменяет тип переменной в соответствии с хранящимися в ней данными.

Подобная возможность явного изменения типов на лету может оказаться исключительно полезной. Помните, что РНР “автоматически” распознает тип данных, помещаемых в переменные. РНР возвращает данные именно того типа, который был назначен переменной.

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

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

Например, мы можем объявить две использованные выше переменные, применив при этом механизм приведения типов:

$totalqty = 0;

$totalamount = (float)$totalqty;

Вторая строка означает: "Взять значение, хранящееся в переменой $totalqty, интерпретировать его как значение типа float и сохранить в переменной $totalamount." Переменная $totalamount получит тип float. Приведение типов не меняет тип исходной переменной, поэтому тип переменной $totalqty остается integer.

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

РНР предоставляет в распоряжение разработчиков еще один тип переменных — так называемые переменные переменных. Переменные переменных позволяют динамически менять имена переменных.

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

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

$varname = "tireqty";

Затем вместо $tireqty можно использовать $$varname, например:

$$varname = 5;

Это в точности эквивалентно следующему:

$tireqty = 5;

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