Есть ли разница между $str = = " и strlen ($str) == 0 в PHP?
Как говорится в заголовке: есть ли разница между $str == " и strlen($str) == 0 в PHP? Есть ли реальная разница в скорости и лучше в использовании, чем другие?
11 ответов
Да, есть важное различие. Оператор == не преобразования типа, поэтому он не всегда будет делать то, что вы ожидаете. Например, (0 == "") возвращает true. Таким образом, Вы делаете предположение, что $str на самом деле является строкой. Если вы уверены, что это так, или если вас не волнуют конверсии, тогда все в порядке. В противном случае вы должны использовать = = = и предпринять шаги, чтобы убедиться, что вы сравниваете строки.
основное отличие заключается в том, что $str = = " вернет true для всего, что эквивалентно пустой строке (0 и false,среди других).
вы должны использовать оператор === для проверки фактической пустой строки или, если вы не возражаете против поведения преобразования и тестирования, просто используйте !$str (рассмотрим пустая() также, в зависимости от фактического намерения), который я нахожу более ясным в намерении, чем $x = = " (он пропустил знак = и на самом деле хочет проверить пустая строка?.)
используйте strlen ($str) только тогда, когда вы действительно после длины строки.
в нижней строке используйте правильный инструмент для задания, оценивая, какой инструмент является правильным на основе намерения кода.
vinko@parrot:~$ cat emptytest.php
<?php
$a = "";
$b = 0;
$c = false;
$d = "Hi!";
function is_empty1($x) { return $x == ''; }
function is_empty2($x) { return strlen($x) == 0; }
function is_empty3($x) { return $x === ''; }
function check_empty($arr) {
foreach ($arr as $v) {
echo "value is ";
var_dump($v);
echo " $x == '' ";
var_dump(is_empty1($v));
echo " strlen($x) == 0 ";
var_dump(is_empty2($v));
echo " $x === '' ";
var_dump(is_empty3($v));
}
}
check_empty(array($a,$b,$c,$d));
?>
vinko@parrot:~$ php emptytest.php
value is string(0) ""
$x == '' bool(true)
strlen() == 0 bool(true)
$x === '' bool(true)
value is int(0)
$x == '' bool(true)
strlen() == 0 bool(false)
$x === '' bool(false)
value is bool(false)
$x == '' bool(true)
strlen() == 0 bool(true)
$x === '' bool(false)
value is string(3) "Hi!"
$x == '' bool(false)
strlen() == 0 bool(false)
$x === '' bool(false)
Я проводила простой тест. (Я никогда не делал этого, поэтому это может быть полностью недействительным.) IT tests ==", strlen() == 0, === ", и strlen () = = = 0.
header('Content-type: text/plain');
// -- Testing == '';
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string == '';
$endTime = microtime(true);
echo "$string = ''; $string == ''; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string == '';
$endTime = microtime(true);
echo "$string = '$string'; $string == ''; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
'' == '';
$endTime = microtime(true);
echo "'' == ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing strlen() == 0;
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) == 0;
$endTime = microtime(true);
echo "$string = ''; strlen($string) == 0; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) == 0;
$endTime = microtime(true);
echo "$string = '$string'; strlen($string) == 0; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen('') == 0;
$endTime = microtime(true);
echo "strlen('') == ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing === '';
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string === '';
$endTime = microtime(true);
echo "$string = ''; $string === ''; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string === '';
$endTime = microtime(true);
echo "$string = '$string'; $string === ''; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
'' === '';
$endTime = microtime(true);
echo "'' === ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing strlen() === 0;
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) === 0;
$endTime = microtime(true);
echo "$string = ''; strlen($string) === 0; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) === 0;
$endTime = microtime(true);
echo "$string = '$string'; strlen($string) === 0; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen('') === 0;
$endTime = microtime(true);
echo "strlen('') === ''; took " . ($endTime - $startTime) . " seconds\n";
результаты:
$string = ''; $string == ''; took 1.01983308792 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $string == ''; took 1.04193401337 seconds
'' == ''; took 1.06608295441 seconds
$string = ''; strlen($string) == 0; took 2.1510848999 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; strlen($string) == 0; took 2.27101397514 seconds
strlen('') == ''; took 2.5775551796 seconds
$string = ''; $string === ''; took 0.854554176331 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $string === ''; took 0.714010000229 seconds
'' === ''; took 0.749495983124 seconds
$string = ''; strlen($string) === 0; took 1.9263010025 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; strlen($string) === 0; took 1.95309996605 seconds
strlen('') === ''; took 2.40874910355 seconds
Как вы можете видеть, сравнение с " примерно в два раза быстрее, чем сравнение длины строки. Кроме того, использование === немного быстрее, чем использование==, и это безопасно! Милый.
$str = = " - лучшая практика. Вероятно, в PHP нет большой разницы, так как он знает длину своих строк, но было бы очень плохой привычкой, если бы вы тогда пошли и сделали некоторую работу на языке более низкого уровня.
при выполнении $str==''
. Например, рассмотрим случаи, когда $str
is false
(boolean) или 0
(целое число). Они тоже могут выйти равными. Я не совсем уверен насчет этого, так что тебе стоит немного повозиться с этим. Безопасным способом было бы сделать $str===''
.
разница в скорости слишком мала, чтобы иметь значение, я уверен. Лучше всего использовать более читаемый метод. Вот еще две альтернативы:
if (empty($str)) {
...
}
if (!$str) {
...
}
Примечание: они оба будут оцениваться как true, если $str = = '0'.
нет, они не одинаковые (как описано выше), но для ваших целей они могут быть взаимозаменяемыми.
быстрее? Качественно трудно представить ситуацию, когда разница в любом случае была бы последовательной, но см. другие более количественные ответы. Кодирование в зависимости от скорости Вот это наверное пример из наших любимых уничижительный, которые могут быть abbrevated "Пи".
Что лучше?
Это зависит от того, какое утверждение о $str вы хотите подтвердить, и какие последствия вы хотите вызвать.
еще один общий шаблон, который вы увидите, это
!$ str
который дает в целом тот же результат - и может быть подходящим, если вы просто хотите проверить строковое значение, которое непригодно, независимо от того, почему оно непригодно - которое может быть отсутствием инициализации, инициализации по умолчанию, назначения и т. д. (Я не спорю за или против этого представления, кстати.) Помните, что то, что вы решите, предположительно будет иметь последствия, и вам нужно понять, какие состояния $str вызывают какие последствия, основываясь на том, как вы написали код. (И обратите внимание, что есть значение/состояния $str, которые вы могли бы явно не охватить ни одним из наших вариантов.)
Я считаю, что это яснее просто сделать "если (!$ул. "). не уверен насчет '==' но '!"должен быть в состоянии использовать лучшие методы оптимизации, поскольку никакая типизация никогда не выполняется и безопасна для строк, массивов, булов, чисел...