Сделай Сам Свою Работу на 5

Типы данных в РНР, преобразование типов





 

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

 

Integer

 

integer - целое число, не имеет дробной части и представляется последовательностью из одной или нескольких цифр. Восьмеричные числа начинаются с цифры 0, после которой следует серия цифр от 0 до 7. Шестнадцатеричные целые числа имеют префикс 0х или 0Х и могут состоять из цифр от 0 до 9 и букв от а (А) до f (F).

 

String

 

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

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



 

Два следующих объявления дают одинаковый результат (пример 2.6.2.1):

 

$food = "apple";

$food = 'apple';

 

Однако результаты следующих объявлений сильно различаются (пример 2.6.2.2):

 

$sentence = "My favorite food is $food";

$sentence2 = 'My favorite food is $food';

 

Переменной $sentence присваивается строка

 

My favorite food is apple.

 

Обратите внимание: переменная $food автоматически интерпретируется. С другой стороны, переменной $sentence2 присваивается строка

 

My favorite food is $food.

 

В отличие от переменной $sentence, в $sentence2 осталась не интерпретированная переменная $food. Различия обусловлены использованием кавычек и апострофов при присваивании переменным $sentence и $sentence2.

 

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



 

Последовательность Смысл
\n Новая строка
\r Возврат курсора
\t Горизонтальная табуляция
\\ Обратная косая черта
\$ Знак доллара
\" Кавычка
\[0-7]{1,3} Восьмеричная запись числа (в виде регулярного выражения)
\x[0-9A-Fa-f]{l,2} Шестнадцатиричная запись числа (в виде регулярного выражения)

 

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

 

$double_list = "item1\nitem2\nitem2";

$single_list = 'item1\nitem2\nitem2';

 

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

К отдельным символам строки можно обращаться как к элементам массива с последовательной нумерацией (см. следующий раздел). Пример 2.6.2.4:



 

$sequence_number = "04efgh";

$letter = $sequence_number[4];

 

Переменной $letter будет присвоено значение g. Нумерация элементов массивов начинается с 0. Соответственно, выражение $sequence_number[l] будет равно 4.

 

 

Boolean

 

boolean - логический тип данных принимает всего два значения: истинное (true) и ложное (false). Логические величины создаются двумя способами: при проверке условий и в виде значений переменных.

 

Real, Double, Float

 

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

 

Array

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

 

Object

 

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

 

Пример 2.6.6.1:

 

class appliance

{

var power:

function set_power($on_off)

{

$this->power = $on_off;

}

}

...

$blender = new appliance;

 

Определение класса задает атрибуты и функции, связанные с некоторой структурой данных - в данном примере это структура с именем appliance (устройство). У этой структуры имеется всего один атрибут power (мощность). Для изменения этого атрибута создается метод set_power.

Помните: определение класса - всего лишь шаблон, и выполнять операции с ним в программе невозможно; сначала нужно создать объекты на основе этого шаблона. Объекты создаются при помощи ключевого слова new. Например, в приведенном выше фрагменте создается объект $blender класса appliance.

После создания объекта $blender можно задать его мощность при помощи метода (пример 2.6.6.2)

 

set_power: $blender->set_power("on");

 

Переключение типов

 

Иногда бывает удобно использовать переменные способами, не предусмотренными при их создании. Допустим, вам захочется прибавить строковое значение "15" к целому числу 12. Тип переменных PHP может изменяться и без использования механизма явного преобразования. Этот процесс, независимо от того, выполняется ли он прямо или косвенно, называется переключением (juggling) типов. Лучше всего продемонстрировать сказанное на конкретных примерах.

Предположим, вы суммируете две величины - строку и целое число. Результат зависит от содержимого строки. Например, при суммировании целого числа со строковым представлением числа будет получено целое число (пример 2.6.7.1):

 

$variable1 = 3;

$variable2 = "2";

$variable3 = $variable1 + $variable2;

// $variable3 присваивается 5.

 

Другой пример переключения типов - суммирование целого числа с вещественным. При этом целое число преобразуется к вещественному типу, чтобы избежать потери точности (пример 2.6.7.2):

 

$variable1 = 3;

$variable2 = 5.4;

$variable3 = $variable1 + $variable2;

// $v ariablel интерпретируется как вещественное число.

// и $variable3 присваивается 8.4.

 

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

 

$variable1 = 5;

$variable2 = "100 bottles of beer on the wall";

$variable3 = $variable1 + $variable2;

// $variable3 присваивается 105

 

В результате переменной $variable3 присваивается значение 105. Это происходит из-за того, что лексический анализатор PHP определяет тип по началу строки. Допустим, мы привели переменную $variable2 к виду "There are 100 bottles of beer on the wall". Поскольку алфавитные символы трудно интерпретировать как целое число, строка интерпретируется как 0, и переменной $variable3 присваивается 5.

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

 

Преобразование типов

 

Явное приведение переменной к типу, отличному от того, который изначально предназначался для неё, называется преобразованием (casting) типа. Изменение типа может быть как временным, одноразовым, так и постоянным.

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

 

Оператор преобразования типа Новый тип
(int) или (integer) Целое число
(real), (double) или (float) Вещественное число
(string) Строка
(array) Массив
(object) Объект

 

Простой пример преобразования типов (пример 2.6.8.1):

 

$variable1= 13; // $variable1 присваивается целое число 13

$variable2 = (double) $variable1; // $variable2 присваивается 13.0

 

Хотя переменная $variable1 первоначально содержала целое число 13, преобразование (double) преобразует ее к вещественному типу (поэтому число 13 превращается в 13.0). Полученное значение присваивается переменной $variable2.

При суммировании целого числа с вещественным получается вещественный результат. Однако тип результата можно изменить посредством явного преобразования типа (пример 2.6.8.2):

 

$variable1 = 4.0;

$variable2 = 5;

$variable3 = (int) $variable1 + $variable2;

// $variable3 = 9

 

Следует заметить, что преобразование вещественного типа к целому всегда сопровождается округлением (пример 2.6.8.3):

 

$variable1 = 14.7:

$variable2 = (int) $varlable1;

// $variable2 = 14:

 

Строку или переменную другого типа также можно преобразовать в элемент массива. В этом случае преобразованная переменная становится первым элементом массива (пример 2.6.8.4):

 

$variable1 = 1114;

$array1 = (array) $varable1;

print $array1[0]; // Выводится значение 1114

 

Наконец, любой тип данных можно преобразовать в объект. Переменная становится атрибутом объекта, и ей присваивается имя scalar (пример 2.6.8.5):

 

$model = "Toyota";

$new_obj = (object) $model;

 

Ссылка на исходное строковое значение выглядит так (пример 2.6.8.6):

 

print $new_obj->scalar;

 

Есть функция gettype(), возвращающая тип, который РНР назначил переменной (пример 2.6.8.6):

 

<?

$var = "5";

$var1 = 5;

echo(gettype($var));

echo "<br>";

echo(gettype($var1));

?>

 

В первом случае РНР вернет string, во втором integer.

 

Существует также функция settype(), которая явно устанавливает тип (пример 2.6.8.7):

 

<?

$var = "5";

echo(gettype($var));

settype($var,integer);

echo "<br>";

echo(gettype($var));

?>

 

Выполнение этого фрагмента кода приведет к такому же результату, как и предыдущего.

 

 

Операторы PHP

 

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

Операторы бывают трех видов:

· унарные операторы, которые работают только с одним аргументом, например, ! (оператор отрицания) или ++ (инкримент);

· бинарные операторы - большинство поддерживаемых в PHP операторов;

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

 

Приоритет операторов определяет, насколько "тесно" связанны между собой два выражения. Например, выражение 1 + 5 * 3 вычисляется как 16, а не 18, поскольку операция умножения ("*") имеет более высокий приоритет, чем операция сложения ("+"). В случае, если операторы имеют одинаковый приоритет, они будут выполняться слева направо. Круглые скобки могут использоваться для принудительного указания необходимого порядка выполнения операторов. Например, выражение (1 + 5) * 3 вычисляется как 18.

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

 

Ассоциативность Оператор
неассоциативна new
правая [
неассоциативна ++ --
неассоциативна ! ~ - (int) (float) (string) (array) (object) @
левая * / %
левая + - .
левая << >>
неассоциативна < <= > >=
неассоциативна == != === !==
левая &
левая ^
левая |
левая &&
левая ||
левая ? :
правая = += -= *= /= .= %= &= |= ^= <<= >>=
левая and
левая xor
левая or
левая ,

 

Оператор присвоения

 

Базовый оператор присвоения обозначается как =

Результатом выполнения оператора присвоения является само присвоенное значение. Таким образом, результат выполнения $a = 3 будет равен 3. Это позволяет использовать конструкции вида (пример 2.7.1.1):

 

$a = ($b = 4) + 5;

// результат: $a установлена значением 9, переменной $b присвоено

 

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

 

$a = 3;
$a += 5;

// устанавливает $a значением 8, аналогично записи: $a = $a + 5;
$b = "Hello ";
$b .= "There!";

// устанавливает $b строкой "Hello There!", как и $b = $b . "There!";

 

Обратите внимание, что присвоение копирует оригинальную переменную в новую (присвоение по значению), таким образом, все последующие изменения одной из переменных на другой никак не отражаются. Начиная с PHP 4, также поддерживается присваивание по ссылке, используя синтаксис $var = &$othervar;, но в PHP 3 такая возможность отсутствует. 'Присвоение по ссылке' означает, что обе переменные указывают на одни и те же данные и никакого копирования не происходит.

 

Арифметические операторы

 

Пример Название Результат
-$a Отрицание Смена знака $a.
$a + $b Сложение Сумма $a и $b.
$a - $b Вычитание Разность $a и $b.
$a * $b Умножение Произведение $a и $b.
$a / $b Деление Частное от деления $a на $b.
$a % $b Деление по модулю Целочисленный остаток от деления $a на $b.

 

Операция деления ("/") всегда возвращает вещественный тип, даже если оба значения были целочисленными (или строками, которые преобразуются в целые числа). Остаток $a % $b будет отрицательным, для отрицательных значений $a.

Поразрядные операторы

 

Эта группа операторов работает с битовыми представлениями значений целочисленных операндов. В основном эти операторы применяются для создания набора булевых флагов.

 

 

Пример Название Результат
$a & $b Побитовое 'и' Устанавливаются только те биты, которые установлены и в $a, и в $b.
$a | $b Побитовое 'или' Устанавливаются те биты, которые установлены либо в $a, либо в $b.
$a ^ $b Исключающее или Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b
~ $a Отрицание Устанавливаются те биты, которые в $a не установлены, и наоборот.
$a << $b Сдвиг влево Все биты переменной $a сдвигаються на $b позиций влево (каждая позиция подразумевает 'умножение на 2')
$a >> $b Сдвиг вправо Все биты переменной $a сдвигаються на $b позиций вправо (каждая позиция подразумевает 'деление на 2')

 

Пример 2.7.3.1:

 

<?

echo(4<<2); // равно 16

echo"<br>";

echo(5>>1); // равно 2

echo"<br>";

echo(6&5); // равно 4

echo"<br>";

echo(6|5); // равно 7

echo"<br>";

echo(6^5); // равно 3

?>

 

Логические операторы

 

Пример Название Результат
$a and $b Логическое 'и' TRUE если и $a, и $b TRUE.
$a or $b Логическое 'или' TRUE если или $a, или $b TRUE.
$a xor $b Исключающее 'или' TRUE если $a, или $b TRUE, но не оба.
! $a Отрицание TRUE если $a не TRUE.
$a && $b Логическое 'и' TRUE если и $a, и $b TRUE.
$a || $b Логическое 'или' TRUE если или $a, или $b TRUE.

 

Смысл двух разных вариантов для операторов "and" и "or" в том, что они работают с различными приоритетами.

Операторы этой группы, в отличие от поразрядных, работают с логическими переменными (boolean) и интенсивно используются в управляющих конструкциях. Логические переменные, имеют лишь два значения: true (истина) и false (ложь). В выражениях true и false можно заменить на 1 (любое отличное от 0 число) и 0, соответственно. Возможность замены true и false на 1 и 0 – это «наследство» языка С, в котором не было специальных переменных true и false.

Логически операторы для переменных типа boolean выполняют роль операторов сложения, вычитания для обычных переменных.

Приоритетность выполнения логических операторов: or > xor > and > || > && > ! Иногда в условиях удобно использовать скобки для явного задания приоретета (пример 2.7.4.1):

 

<?

$flag1 = true;

$flag2 = true;

$flag3 = false;

if( $flag1 && $flag2 || $flag3)

{

echo "<p>Условие истинно<p>";

}

else

{

echo "<p>Условие ложно<p>";

}

?>

 

Результатом будет вывод фразы «Условие истинно», так как согласно приоритету исполнения сначала выполняется оператор &&, так как оба флага равны true – возвращается true, затем это выражение сравнивается с $flag3 (true || $flag3) – что возращает тоже true, так как одно из сравниваемых равно true.

 

Если же мы запишем (пример 2.7.4.2):

 

<?

$flag1 = true;

$flag2 = true;

$flag3 = false;

if($flag1 && ($flag2 && $flag3))

{

echo "<p>Условие истинно<p>";

}

else

{

echo "<p>Условие ложно<p>";

}

?>

 

результатом будет «Условие ложно».

 

 

Операторы сравнения

 

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

 

 

Пример Название Результат
$a == $b Равно TRUE если $a равно $b.
$a === $b Тождественно равно TRUE если $a равно $b и имеет тот же тип. (Добавлено в PHP 4)
$a != $b Не равно TRUE если $a не равно $b.
$a <> $b Не равно TRUE если $a не равно $b.
$a !== $b Тождественно не равно TRUE если $a не равно $b или в случае, если они разных типов (Добавлено в PHP 4)
$a < $b Меньше TRUE если $a строго меньше $b.
$a > $b Больше TRUE если $a строго больше $b.
$a <= $b Меньше или равно TRUE если $a is меньше или равно $b.
$a >= $b Больше или равно TRUE если $a больше или равно $b.

В случае, если вы сравниваете целое со строкой, строка будет преобразована к числу. В случае, если вы сравниваете две числовые строки, они сравниваются как целые числа. Эти правила также распространяются на оператор switch.

 

Пример 2.7.5.1:

 

var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true

switch ("a")

{
case 0: echo "0"; break;
case "a": echo "a"; break; // Эта ветка никогда не будет достигнута, так как "a" уже сопоставленно с 0
}

 

Еще одним условным оператором является тернарный оператор "?:".

 

Пример 2.7.5.2:

 

// Пример использования тернарного оператора
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

// Приведенный выше код аналогичен следующему блоку с использованием if/else
if (empty($_POST['action']))

{
$action = 'default';
}

else

{
$action = $_POST['action'];
}

 

Выражение (expr1) ? (expr2) : (expr3) интерпретируется как expr2, если expr1 вычисляется в TRUE, или как expr3 если expr1 вычисляется в FALSE.

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.