Существует ли различие между $str == '' и strlen ($str) == 0 в PHP?

Если вы действительно хотите одно утверждение без изменения рассматриваемого списка, вы можете попробовать my_list[:my_list.index(value)]+my_list[my_list.index(value)+1:]. Это имеет недостатки

  • , которые вы вычисляете my_list.index(value) дважды (не обязательно 3.8+, см. PEP572 )
  • , которые вы нарезаете и добавляете, что очень больше, чем просто удаление
  • , на самом деле (рядом) это не так ясно, как my_list.remove(val)

И,


Отказ от ответственности : я действительно не рекомендую вам делать это. Но это всего лишь метод, который мне пришёл в голову.

Я действительно не вижу проблемы в написании list.remove () и печати в отдельных выражениях.

- Джей

blockquote>

6
задан Darryl Hein 19 December 2008 в 19:25
поделиться

11 ответов

Да, существует важное различие. == оператор делает преобразование типов, таким образом, это не всегда собирается сделать то, что Вы ожидаете. Например, (0 =="") возвращает true. Таким образом, Вы делаете предположение, что $str является на самом деле строкой. Если Вы уверены дело обстоит так, или если Вы не заботитесь о преобразованиях, то это прекрасно. Иначе необходимо использовать === и предпринять шаги, чтобы гарантировать сравнение строк.

11
ответ дан 8 December 2019 в 02:03
поделиться

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

17
ответ дан 8 December 2019 в 02:03
поделиться

Основное различие - то, что $str == '' возвратит true для чего-либо, что это эквивалентно пустой строке (0 и ложь среди других).

Необходимо использовать или === оператор для тестирования на фактическую пустую строку или, если Вы не возражаете против преобразования и тестируете поведение, просто используйте! $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)
10
ответ дан 8 December 2019 в 02:03
поделиться

Я выполнил простой сравнительный тест. (Я никогда не делал того, таким образом, это может быть абсолютно недопустимо.) Это тестирует =='', 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

Как Вы видите, по сравнению с '' о дважды с такой скоростью, как сравнение длины строки. Кроме того, использование === немного быстрее, чем использование ==, и это безопасно с точки зрения типов!Мило.

7
ответ дан 8 December 2019 в 02:03
поделиться

Даже если бы было различие в скорости, то Вы не должны выбирать более быстрый. Выберите более ясный.

4
ответ дан 8 December 2019 в 02:03
поделиться

$str == '' является лучшей практикой. Вероятно, нет большого различия в PHP, так как это знает длину своих строк, но это была бы действительно дурная привычка иметь, если бы Вы затем пошли и сделали некоторую работу на языке низшего уровня.

1
ответ дан 8 December 2019 в 02:03
поделиться

Возможно:! strlen ($str)

1
ответ дан 8 December 2019 в 02:03
поделиться

strlen ($str) == 0 требует, чтобы вызов к strlen и вызов сделали сравнение. $str == '' является просто сравнением.

1
ответ дан 8 December 2019 в 02:03
поделиться

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

1
ответ дан 8 December 2019 в 02:03
поделиться

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

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

if (!$str) {
    ...
}

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

1
ответ дан 8 December 2019 в 02:03
поделиться

Нет, они не то же (как объяснено выше), но в Ваших целях они могли бы быть взаимозаменяемыми.

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

Который является лучшим?

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

Другой общий шаблон, который Вы будете видеть,

! $str

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

1
ответ дан 8 December 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: