Столкнулся с особенностью приведения типов в PHP. Это вроде и известно, но сегодня я попался на этом.
Что будет в случаях?
$a = 'строка'; $b = 0; if ( $a == $b ) var_dump('равно'); else var_dump('не равно');
и
$a='125строка'; $b=125; if ($a==$b) var_dump('равно'); else var_dump('не равно');
Кажется, что в первом и втором случаях будет «не равно» ?
А вот и нет ? .
В двух случаях выражения будут «равно».
В PHP происходит автоматическое приведение типа.
Т.е. при сравнении с числом выражение вида «строка» приводится к 0,
а выражение вида «125строка» — к 125
————————————————————-
У меня возникла следующая ситуация.
Есть адрес вида www.ato.by/?value=ххх , где ххх — это число.
Мне потребовалось, в случае если ввели «/?value=хххстрока»,
делать автоматический 301 редирект на адрес «/?value=ххх»
В начале сделал так:
if ($_GET['value'] != intval($_GET['value'])) { $URL= "http://site.ru/?value=" . intval($_GET['value']) header ("Location: $URL"); }
— не работает по указанной выше причине.
Для избежания данной ситуаций требуется использовать конструкции:
- 1) функцию is_numeric
- 2) (string)$id == (string)(int)($id)
- 3) === — т.е. проверять совпадение типа и значения
Т.е. в моем случае следовало использовать:
if ( !is_numeric($_GET['value']) ) { $URL= "http://site.ru/?value=" . intval($_GET['value']) header ("Location: $URL"); }
или
if ( (string)$_GET['value'] != (string)(int)($_GET['value']) ) { $URL= "http://site.ru/?value=" . intval($_GET['value']) header ("Location: $URL"); }
itif.ru
Приведение к целому числу
При приведении bool
в integer
, FALSE
преобразуется в 0 (нуль), а TRUE
— в 1 (единицу). При приведении float
в integer
, дробная часть будет округлена в сторону нуля. Значение NULL
преобразуется в 0:
echo (int)FALSE, "<br>"; // 0 echo (int)TRUE, "<br>"; // 1 echo (int)12.3, "<br>"; // 12 echo (int)NULL; // 0
Строки преобразуются по следующим правилам:
- Если первый символ строки является цифрой, знаком
+
или-
, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ отличный от цифры, после этого интерпретатор возвращает полученное целое число. - Если строка пустая или первый символ строки не является цифрой, знаком
+
или-
, она преобразуется в 0.
echo (int)"12abc", "<br>"; // 12 echo (int)"a123bc", "<br>"; // 0 echo (int)"-12", "<br>"; // -12 echo (int)"12.3", "<br>"; // 12 echo (int)""; // 0
Для других типов поведение преобразования в integer
не определено. Поэтому не нужно полагаться на любое наблюдаемое поведение, так как оно может измениться без предупреждения.
Приведение к числу с плавающей точкой
Строки преобразуются по следующим правилам:
- Если первый символ строки является цифрой, точкой, знаком
+
или-
, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, точкой (если перед этим была цифра), буквойe
илиE
(если перед этим была цифра или точка), то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ, который не может быть преобразован в числовое значение, после этого интерпретатор возвращает полученное число с плавающей точкой. - Если строка пустая или первый символ строки не является цифрой, точкой, знаком
+
или-
, она преобразуется в 0.
echo (float)"12abc", "<br>"; // 12 echo (float)"a123bc", "<br>"; // 0 echo (float)"-12", "<br>"; // -12 echo (float)"12.3", "<br>"; // 12.3 echo (float)".13", "<br>"; // 0.13 echo (float)"1.2e5", "<br>"; // 120000 echo (float)"1.e5"; // 100000
Значения других типов сначала преобразуются в integer
, а затем уже из integer
происходит преобразование в тип float
.
Приведение к булеву типу
Следующие значения в результате преобразования дают значение FALSE
:
- само значение
FALSE
- 0 и 0.0 (нуль)
- пустая строка, и строка «0»
- массив без элементов
NULL
- Объекты
SimpleXML
, созданные из пустых тегов
Все остальные значения при преобразовании дают в результате значение TRUE
. Значение FALSE
и шесть значений, которые при преобразовании приводятся к этому значению, обычно называют ложными значениями, а все остальные — истинными:
echo (bool)"", ": FALSE", "<br>"; // FALSE echo (bool)1, ": TRUE", "<br>"; // TRUE echo (boolean)[], ": FALSE"; // FALSE
В любом контексте, когда интерпретатор PHP ожидает получить булево значение, ложные значения интерпретируются как FALSE
, а истинные значения — как
TRUE
.
Приведение к строке
Булево значение TRUE
преобразуется в строку «1», а значение FALSE
преобразуется в ""
(пустую строку):
echo (string)TRUE; echo (string)FALSE, "<br>: пустая строка";
Целое число или число с плавающей точкой преобразуется в строку, состоящую из цифр числа:
echo (string)-123, "<br>"; echo (string)12.4, "<br>"; echo (string)1.4e6; // "1400000"
Массивы всегда преобразуются в строку "Array"
:
$arr = []; echo (string)$arr;
NULL
всегда преобразуется в пустую строку:
echo (string)NULL, "пустая строка";
Resource
всегда преобразуется в строку вида "Resource id #1"
.
Для преобразования объекта в строку, объект должен иметь метод __toString()
:
class Obj { public function __toString() { return "Object"; } } $obj = new Obj; echo (string)$obj;
Если объект не имеет метод __toString()
, то в результате преобразования будет вызвана фатальная ошибка:
class Obj {} $obj = new Obj; echo (string)$obj; // Будет вызвана ошибка
Приведение к NULL
Приведение к типу NULL
не удаляет переменную и её значение, а лишь возвращает значение типа NULL
:
$num = 10; echo gettype((unset)$num), "<br>"; echo $num;
puzzleweb.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
Вот что я написал для упрощения вещей для себя:
Он также возвращает сокращенные версии логических, целых, двойных и реальных.
function type($mixed, $parseNumeric = false) { if ($parseNumeric && is_numeric($mixed)) { //Set type to relevant numeric format $mixed += 0; } $t = gettype($mixed); switch($t) { case 'boolean': return 'bool'; //shorthand case 'integer': return 'int'; //shorthand case 'double': case 'real': return 'float'; //equivalent for all intents and purposes default: return $t; } }
Тип вызова с parseNumeric, установленным в true, преобразует числовые строки перед проверкой типа.
Таким образом:
type ("5", true) вернет int
type ("3.7", true) вернет float
type ("500") вернет строку
Просто будьте осторожны, так как это своего рода метод ложной проверки, и ваша действительная переменная все равно будет строкой.
x41F;ри необходимости вам нужно будет преобразовать действительную переменную в правильный тип. Я просто нуждался в нем, чтобы проверить, должна ли база данных загружать идентификатор элемента или псевдоним, поэтому не имеет никаких неожиданных эффектов, так как в любом случае он будет разбираться как строка во время выполнения.
редактировать
Если вы хотите определить, являются ли объекты функциями, добавьте этот случай к коммутатору:
case 'object': return is_callable($mixed)?'function':'object';
ruphp.com
Строки и числа
Строки — это, прежде всего, совокупности различных символов. В разных средствах программирования дробная часть отделялась от целой по-разному. Одни предпочитали точку, другие запятую (в PHP преобразование строки в число подразумевает «.»). Триады разделялись одинарным апострофом, запятой или пробелом. Вещественные числа записывались через букву «Е».
Все это формальности. Математика и принципы работы любого процессора всегда признавали числа без излишеств, а для работы с вещественными значениями были разработаны соответствующие дополнительные процессоры.
Но мир переменных конкретного типа (для программ начала эры) и реализация современной идеи консенсуса всех типов данных означает: в PHP преобразовать строку в число все равно что ничего не сделать. В лучшем случае PHP «отрежет», а точнее, сделает 0 или число, если в исходной строке есть хотя бы одна цифра. Все цифры до первого нецифрового символа составят это число.
Общее правило преобразования
На PHP преобразование строки в число, если программист не указал иное, происходит автоматически в момент применения. Если переменная содержит только цифры и точку, то может быть получено вещественное число. Если в последовательности цифр встретится запятая, то все, что идет до нее, будет интерпретировано как число, естественно, целое.
Любой нецифровой символ в последовательности цифр останавливает процесс, и результат преобразования PHP «строка в число» будет только тем значением, которое сформировалось до первого нецифрового символа.
Математика и обработка символов
Что сложнее, первое или второе, даже с позиций формул, не помещающихся на странице, внушительных матриц, графов, распутать которые порой не могут даже авторы, производных от интегралов, дифференциалов от интегралов и многочленов в n-том поколении, сказать очень просто: общество, несомненно, чтит заслуги математики и математиков, но обработка символов важнее, сложнее и покрывает математику, как пуховое одеяло, обеспечивая пытливому уму, не могущему выйти за пределы магии чисел, благоприятную среду для творчества.
Обычно на PHP строка в число преобразуется автоматически, но никогда не будет лишним проверить это. Лучше всего всегда быть уверенным: PHP правильно понимает, что та или иная переменная — это число. Если есть хоть тень сомнения, следует явно указать тип переменной (int) или (float) перед значением и проверить, как PHP понимает тип переменной функциями is_integer() или is_float().
monateka.com
The object casting methods presented here do not take into account the class hierarchy of the class you're trying to cast your object into.
/**
* Convert an object to a specific class.
* @param object $object
* @param string $class_name The class to cast the object to
* @return object
*/
public static function cast($object, $class_name) {
if($object === false) return false;
if(class_exists($class_name)) {
$ser_object = serialize($object);
$obj_name_len = strlen(get_class($object));
$start = $obj_name_len + strlen($obj_name_len) + 6;
$new_object = 'O:' . strlen($class_name) . ':"' . $class_name . '":';
$new_object .= substr($ser_object, $start);
$new_object = unserialize($new_object);
/**
* The new object is of the correct type but
* is not fully initialized throughout its graph.
* To get the full object graph (including parent
* class data, we need to create a new instance of
* the specified class and then assign the new
* properties to it.
*/
$graph = new $class_name;
foreach($new_object as $prop => $val) {
$graph->$prop = $val;
}
return $graph;
} else {
throw new CoreException(false, "could not find class $class_name for casting in DB::cast");
return false;
}
}
php.net