Используете ли вы оператор нестрогого сравнения ("==") в PHP?

от автора

Из-за того, что в PHP при сравнении строк оператор "==" пытается сначала преобразовать их в числа [1][2] (даже, если оба операнда — строки), результат порой может оказаться неожиданным:

<?php var_dump('123' == '       123'); // true var_dump('1e3' == '1000'); // true var_dump('+74951112233' == '74951112233'); // true var_dump('00000020' == '0000000000000000020'); // true var_dump('0X1D' == '29E0'); // true var_dump('0xafebac' == '11529132'); // true var_dump('0xafebac' == '0XAFEBAC'); // true var_dump('0xeb' == '+235e-0'); // true var_dump('0.235' == '+.235'); // true var_dump('0.2e-10' == '2.0E-11'); // true var_dump('61529519452809720693702583126814' == '61529519452809720000000000000000'); // true в php < 5.4.4 

Подобное сравнение также используется и в некоторых функциях. Например, в in_array:

<?php $_GET['fileId'] = '0X1D'; // ... $privateFileIds = array('29E0'); if (in_array(@$_GET['fileId'], $privateFileIds)) { 	print 'Access deny'; 	exit; }  // Выведет "Access deny", т.к. параметр "$strict" у функции "in_array" по умолчанию равен "false" 

Решением проблемы может служить использование строгой проверки на соответствие:

// Использование оператора идентичности совместно с явным приведением операндов к строковому типу (string) $aaa === (string) $bbb;  // Использование функции "strcmp" strcmp($aaa, $bbb) == 0;  // Использование параметра "$strict" со значением "true" в соответствующих функциях in_array((string) $aaa, $array, true); 

Под строгой проверкой здесь подразумевается сравнение операндов одного типа исключительно по правилам сравнения данного типа.

Используете ли вы для сравнения строк нестрогую проверку на соответствие (оператор "==", параметр "$strict" со значением false и т.п.)?

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

Никто ещё не голосовал. Воздержавшихся нет.

ссылка на оригинал статьи http://habrahabr.ru/post/190440/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *