PHP: Манипуляции с типами — Manual
Манипуляции с типами
PHP не требует (и не поддерживает) явного типа при определении переменной; тип переменной определяется по контексту, в котором она используется. То есть, если вы присвоите значение типа string переменной $var, то $var изменит тип на string. Если вы затем присвоите $var значение типа integer, она станет целым числом (integer).
Примером автоматического преобразования типа является оператор умножения ‘*’. Если какой-либо из операндов является float, то все операнды интерпретируются как float, и результатом также будет float. В противном случае операнды будут интерпретироваться как integer и результат также будет integer. Обратите внимание, что это НЕ меняет типы самих операндов; меняется только то, как они вычисляются и сам тип выражения.
<?php
$foo = "1"; // $foo - это строка (ASCII-код 49)
$foo *= 2; // $foo теперь целое число (2)
$foo = 5 * "10 Little Piggies"; // $foo - это целое число (50)
$foo = 5 * "10 Small Pigs"; // $foo - это целое число (50)
?>
Если последние два примера вам непонятны, смотрите Преобразование строк в числа.
Если вы хотите, чтобы переменная принудительно вычислялась как определенный тип, смотрите раздел приведение типов. Если вы хотите изменить тип переменной, смотрите settype().
Если вы хотите протестировать любой из примеров, приведенных в данном разделе, вы можете использовать функцию var_dump().
Замечание
: Поведение автоматического преобразования в массив в настоящий момент не определено.
К тому же, так как PHP поддерживает индексирование в строках аналогично смещениям элементов массивов, следующий пример будет верен для всех версий PHP:
<?php
$a = 'car'; // $a - это строка
$a[0] = 'b'; // $a все еще строка
echo $a; // bar
?>Более подробно смотрите в разделе Доступ к символу в строке.
Приведение типов
Приведение типов в PHP работает так же, как и в C: имя требуемого типа записывается в круглых скобках перед приводимой переменной.
<?php
$foo = 10; // $foo - это целое число
$bar = (boolean) $foo; // $bar - это булев тип
?>
Допускаются следующие приведения типов:
- (int), (integer) — приведение к integer
- (bool), (boolean) — приведение к boolean
- (float), (double), (real) — приведение к float
- (string) — приведение к string
- (array) — приведение к array
- (object) — приведение к object
- (unset) — приведение к NULL
Приведение типа (binary) и поддержка префикса b были добавлены в PHP 5.2.1. Обратите внимание, что (binary) по существу то же самое, что и (string), но не следует полагаться на этот тип приведения.
Приведение типа (unset) объявлено устаревшим с PHP 7.2.0. Обратите внимание, что приведение типа (unset) это то же самое, что присвоение NULL переменной. Тип приведения (unset) будет удален в PHP 8.0.0.
Обратите внимание, что внутри скобок допускаются пробелы и символы табуляции, поэтому следующие примеры равносильны по своему действию:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Приведение строковых литералов и переменных к бинарным строкам:
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Замечание:
Вместо использования приведения переменной к string, можно также заключить ее в двойные кавычки.
<?php
$foo = 10; // $foo - это целое число
$str = "$foo"; // $str - это строка
$fst = (string) $foo; // $fst - это тоже строка// Это напечатает "они одинаковы"
if ($fst === $str) {
echo "они одинаковы";
}
?>
Может быть не совсем ясно, что именно происходит при приведении между типами. Для дополнительной информации смотрите разделы:
www.php.net
Манипуляции с типами в PHP
Приведение типов в PHP
Поскольку PHP относится к языкам программирования с нестрогой типизацией данных, довольно часто получается так, что интерпретатор ожидает получить данные одного типа, а вместо этого получает данные другого типа. В таких случаях он просто осуществляет преобразование полученных данных к нужному типу.
Приведением типа называется процесс преобразования значения одного типа в значение другого типа.
Не смотря на то, что в большинстве случаев интерпретатор самостоятельно занимается приведением типов, у программиста также имеется возможность
устанавливать и изменять тип переменной при помощи
- (bool), (boolen) – приведение к логическому типу;
- (int), (integer) – приведение к целочисленному типу;
- (float), (double), (real) – приведение к вещественному типу;
- (string) – приведение к строковому типу;
- (array) – приведение к типу array;
- (object) – приведение к типу object;
- (unset) – приведение к NULL.
В ходе приведения типов, во избежание непредвиденных результатов, следует знать правила, по которым происходит преобразование данных одного типа в другой. Перечислим их, после чего рассмотрим пример кода, содержащего данные преобразования типов.
Приведение к типу bool
Во время преобразования к типу bool следующие значения рассматриваются как FALSE:
- само значение false,
- 0 и 0.0,
- пустая строка «» и строка «0»,
- массив без элементов (пустой массив) [],
- значение null,
- объект SimpleXML, созданный из пустых тегов.
Все остальные значения преобразуются в значение TRUE, включая значения типа resource, а также число -1, поскольку оно представляет собой обычное отрицательное число, отличное от нуля.
Приведение к типу integer
В случае привидения к типу integer:
- Логическое значение true преобразуется в 1, false – в 0.
- Значение null преобразуется в 0.
- Вещественные числа округляются вниз, т.е. в сторону нуля. Например, в случае приведения вещественного числа 7.9 к целочисленному типу оно будет преобразовано в число 7. При этом вещественное число не должно превышать максимально допустимые для целых чисел размеры (смотреть) иначе результат будет неопределенным, что вызвано отсутствием достаточной точности у вещественных чисел, чтобы вернуть верный результат. Более того, в данном случае не будет выведено даже замечания. Также не стоит приводить неизвестную дробь к целочисленному типу во избежание получения неожиданных результатов. Например, если привести к типу integer результат выражения ‘(0.1+0.7)*10’, то интерпретатор преобразует его в число 7, а не 8, как ожидалось.
- Если строка начинается с верной записи целого числа, то интерпретатор в процессе приведения строки к целочисленному типу вернет это число, отбросив всю остальную часть строки. Если же строка является пустой «» или начинается не с цифры, знака плюс ‘+’ или знака минус ‘-‘, она будет преобразована в число 0. Например, строка ‘-25 яблок’ будет преобразована в число -25, строка ‘3.5 яблока’ – в число 3, а строка ‘Яблок было 25’ – в число 0.
Для других типов данных приведение к целочисленному типу не определено, поэтому не стоит доверять текущему наблюдаемому поведению, так как оно может измениться без предупреждения.
Приведение к типу float
В случае привидения к типу float для всех типов, за исключением строк, сперва будет совершено преобразование в целочисленный тип, а уже потом целое число будет преобразовано в вещественное. Что касается строк, то:
- если строка начинается с верной записи вещественного числа (включая экспоненциальную форму записи), интерпретатор в процессе приведения строки к вещественному типу вернет это число, отбросив всю остальную часть строки;
- если же строка является пустой «» или начинается не с цифры, знака плюс ‘+’, знака минус ‘-‘ или символа точки ‘.’ (напомним, что при записи вещественных чисел перед точкой ноль разрешается опускать), то она будет преобразована в число 0.
Например, строка ‘1.567e2 кг яблок’ будет преобразована в число 156.7, строка ‘.5 яблока’ – в число 0.5, а строка ‘Было 2.5 кг яблок’ – в число 0.
Приведение к типу string
В случае преобразования значений в строки (т.е. приведение к типу string):
- Логическое значение true преобразуется в строку «1», false – в пустую строку «».
- Целое или вещественное число преобразуется в строку, состоящую из самого числа. При этом учитывается и показатель степени вещественного числа. Например, число 1.567e2 будет преобразовано в строку ‘156.7’, а число .5 – в строку ‘0.5’.
- Специальное значение null преобразуется в пустую строку «».
- Массивы всегда преобразуются в строку ‘Array’.
- Ресурсы (данные типа resource) преобразуются в строку вида «Resource id #№», где № – номер ресурса во время выполнения.
Приведение к типу array
В случае преобразования значения типа bool, integer, float, string или resource в массив, результатом будет массив с этим элементом, индекс которого будет равен 0.
Приведение к типу NULL
Явное приведение переменной к специальному значению null с использованием конструкции ‘(unset) $var’ не удаляет переменную и ее значение, а только возвращает значение null для дальнейшего использования.
Примеры приведения типов
Код, содержащий операции приведения типа, представлен в примере №1.
<?php //Присвоили логическое значение true $var_1=true; //Присвоили логическое значение false $var_2=false; //Теперь $var_1==1 $var_1=(integer) $var_1; //Теперь $var_2==0 $var_2=(integer) $var_2; //Теперь $var_1=="1" $var_1=(string) $var_1; //Теперь $var_2=="0" $var_2=(string) $var_2; //------------------------------------------------ //Присвоили строку "-1" $var_3="-1"; //Присвоили строку ".9345E3" $var_4=".9345E3"; //Теперь $var_3==1 $var_3=(bool) $var_3; //Теперь $var_4==0 $var_4=(integer) $var_4; //------------------------------------------------ //Присвоили строку "-.57" $var_5="-.57"; //Присвоили вещественное число, тоже самое, что и 934.5 $var_6=.9345E3; //Теперь $var_5==["-.57"] $var_5=(array) $var_5; //Теперь $var_6==[934.5] $var_6=(array) $var_6; ?>
Пример №1. Приведение типов переменных
Приведение к другим типам
Преобразование значений в тип resource не имеет смысла. Что касается приведения объектов к другим типам, а также преобразования значений разных типов в объект, то о них мы поговорим позже в соответствующем разделе.
Быстрый переход к другим страницам
belarusweb.net
Манипуляции с типами | Руководство по PHP
PHP не требует (и не поддерживает) явного типа при определении переменной; тип переменной определяется по контексту, в котором она используется. То есть, если вы присвоите значение типа string переменной $var, то $var станет строкой. Если вы затем присвоите $var целочисленное значение, она станет целым числом.
Примером автоматического преобразования типа является оператор сложения ‘+’. Если какой-либо из операндов является float, то все операнды интерпретируются как float, и результатом также будет float. В противном случае операнды будут интерпретироваться как целые числа и результат также будет целочисленным. Обратите внимание, что это НЕ меняет типы самих операндов; меняется только то, как они вычисляются и сам тип выражения.
<?php
$foo = "0"; // $foo это строка (ASCII 48)
$foo += 2; // $foo теперь целое число (2)
$foo = $foo + 1.3; // $foo теперь число с плавающей точкой (3.3)
$foo = 5 + "10 Little Piggies"; // $foo это целое число (15)
$foo = 5 + "10 Small Pigs"; // $foo это целое число (15)
?>
Если последние два примера вам непонятны, смотрите Преобразование строк в числа.
Если вы хотите, чтобы переменная принудительно вычислялась как определенный тип, смотрите раздел приведение типов. Если вы хотите изменить тип переменной, смотрите settype().
Если вы хотите протестировать любой из примеров, приведенных в данном разделе, вы можете использовать функцию var_dump().
Замечание:
Поведение автоматического преобразования в массив в настоящий момент не определено.
К тому же, так как PHP поддерживает индексирование в строках аналогично смещениям элементов массивов, следующий пример будет верен для всех версий PHP:
<?php
$a = 'car'; // $a - это строка
$a[0] = 'b'; // $a все еще строка
echo $a; // bar
?>Более подробно смотрите в разделе Доступ к символу в строке.
Приведение типов
Приведение типов в PHP работает так же, как и в C: имя требуемого типа записывается в круглых скобках перед приводимой переменной.
<?php
$foo = 10; // $foo это целое число
$bar = (boolean) $foo; // $bar это булев тип
?>
Допускаются следующие приведения типов:
- (int), (integer) — приведение к integer
- (bool), (boolean) — приведение к boolean
- (float), (double), (real) — приведение к float
- (string) — приведение к string
- (array) — приведение к array
- (object) — приведение к object
- (unset) — приведение к NULL (PHP 5)
Приведение типа (binary) и поддержка префикса b были добавлены в PHP 5.2.1
Обратите внимание, что внутри скобок допускаются пробелы и символы табуляции, поэтому следующие примеры равносильны по своему действию:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Приведение строковых литералов и переменных к бинарным строкам:
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Замечание:
Вместо использования приведения переменной к string, можно также заключить ее в двойные кавычки.
<?php
$foo = 10; // $foo - это целое число
$str = "$foo"; // $str - это строка
$fst = (string) $foo; // $fst - это тоже строка// Это напечатает "они одинаковы"
if ($fst === $str) {
echo "они одинаковы";
}
?>
Может быть не совсем ясно, что именно происходит при приведении между типами. Для дополнительной информации смотрите разделы:
Вернуться к: Типы
php.ru
строка в число и обратно
Информация во все времена представляла собой символы. Только когда появилось программирование, она частично стала буквами, цифрами и знаками (в формальном смысле).
До известного времени наибольшей популярностью пользовалась устная речь, собственноручно изготовленные символы, жесты, а также произведения искусства, в частности. Важно, что все эти варианты естественного представления информации от мала до велика всегда можно было описать словами, то есть сделать доступными программной обработке в том или ином смысле.
Строки и числа
Строки — это, прежде всего, совокупности различных символов. В разных средствах программирования дробная часть отделялась от целой по-разному. Одни предпочитали точку, другие запятую (в PHP преобразование строки в число подразумевает «.»). Триады разделялись одинарным апострофом, запятой или пробелом. Вещественные числа записывались через букву «Е».
Все это формальности. Математика и принципы работы любого процессора всегда признавали числа без излишеств, а для работы с вещественными значениями были разработаны соответствующие дополнительные процессоры.
Но мир переменных конкретного типа (для программ начала эры) и реализация современной идеи консенсуса всех типов данных означает: в PHP преобразовать строку в число все равно что ничего не сделать. В лучшем случае PHP «отрежет», а точнее, сделает 0 или число, если в исходной строке есть хотя бы одна цифра. Все цифры до первого нецифрового символа составят это число.
Общее правило преобразования
На PHP преобразование строки в число, если программист не указал иное, происходит автоматически в момент применения. Если переменная содержит только цифры и точку, то может быть получено вещественное число. Если в последовательности цифр встретится запятая, то все, что идет до нее, будет интерпретировано как число, естественно, целое.
Любой нецифровой символ в последовательности цифр останавливает процесс, и результат преобразования PHP «строка в число» будет только тем значением, которое сформировалось до первого нецифрового символа.
Математика и обработка символов
Что сложнее, первое или второе, даже с позиций формул, не помещающихся на странице, внушительных матриц, графов, распутать которые порой не могут даже авторы, производных от интегралов, дифференциалов от интегралов и многочленов в n-том поколении, сказать очень просто: общество, несомненно, чтит заслуги математики и математиков, но обработка символов важнее, сложнее и покрывает математику, как пуховое одеяло, обеспечивая пытливому уму, не могущему выйти за пределы магии чисел, благоприятную среду для творчества.
Обычно на PHP строка в число преобразуется автоматически, но никогда не будет лишним проверить это. Лучше всего всегда быть уверенным: PHP правильно понимает, что та или иная переменная — это число. Если есть хоть тень сомнения, следует явно указать тип переменной (int) или (float) перед значением и проверить, как PHP понимает тип переменной функциями is_integer() или is_float().
Тенденции современного программирования
Классическая интерпретация задачи на PHP «строка в число» лежит в пределах представлений современного программирования. Обратный процесс имеет значительно более разнообразные варианты. Функциями number_format(), printf(), sprintf() можно творить чудеса, причем не только на уровне одного числа, но и группы чисел.
Преобразование на PHP «строка в число» свидетельствует, скорее, о том, что и это можем, но математика и численные вычисления — это не наш конек.
Написать приличный и надежный функционал, реализующий ту или иную обработку чисел на PHP, не представляет проблем, и результат не будет чем-то хуже результата от более математических языков. PHP — это, прежде всего, язык сервера, язык для обработки информации, в том числе и математического характера.
fb.ru