Есть ли разница между $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 нет большой разницы, так как он знает длину своих строк, но было бы очень плохой привычкой, если бы вы тогда пошли и сделали некоторую работу на языке более низкого уровня.


может быть: !


strlen ($str) == 0 требует вызова strlen и вызова для сравнения. $str = = " - это просто сравнение.


при выполнении $str==''. Например, рассмотрим случаи, когда $str is false (boolean) или 0 (целое число). Они тоже могут выйти равными. Я не совсем уверен насчет этого, так что тебе стоит немного повозиться с этим. Безопасным способом было бы сделать $str===''.


разница в скорости слишком мала, чтобы иметь значение, я уверен. Лучше всего использовать более читаемый метод. Вот еще две альтернативы:

if (empty($str)) {
    ...
}

if (!$str) {
    ...
}

Примечание: они оба будут оцениваться как true, если $str = = '0'.


нет, они не одинаковые (как описано выше), но для ваших целей они могут быть взаимозаменяемыми.

быстрее? Качественно трудно представить ситуацию, когда разница в любом случае была бы последовательной, но см. другие более количественные ответы. Кодирование в зависимости от скорости Вот это наверное пример из наших любимых уничижительный, которые могут быть abbrevated "Пи".

Что лучше?

Это зависит от того, какое утверждение о $str вы хотите подтвердить, и какие последствия вы хотите вызвать.

еще один общий шаблон, который вы увидите, это

!$ str

который дает в целом тот же результат - и может быть подходящим, если вы просто хотите проверить строковое значение, которое непригодно, независимо от того, почему оно непригодно - которое может быть отсутствием инициализации, инициализации по умолчанию, назначения и т. д. (Я не спорю за или против этого представления, кстати.) Помните, что то, что вы решите, предположительно будет иметь последствия, и вам нужно понять, какие состояния $str вызывают какие последствия, основываясь на том, как вы написали код. (И обратите внимание, что есть значение/состояния $str, которые вы могли бы явно не охватить ни одним из наших вариантов.)


Я считаю, что это яснее просто сделать "если (!$ул. "). не уверен насчет '==' но '!"должен быть в состоянии использовать лучшие методы оптимизации, поскольку никакая типизация никогда не выполняется и безопасна для строк, массивов, булов, чисел...