Я часто вижу использование strlen. Являются ли эти 2 теста эквивалентными для всех значений $str
?
is_string($str) && 0 !== strlen($str)
is_string($str) && '' !== $str
Я часто вижу использование strlen. Являются ли эти 2 теста эквивалентными для всех значений $str
?
is_string($str) && 0 !== strlen($str)
is_string($str) && '' !== $str
Да, эти два утверждения логически эквивалентны. Мои предпочтительные способы снятия шкуры с этой кошки:
is_string($str) && !empty($str)
...хотя empty('0')
это true
(вздох, PHP...), так что, наверное, это даже лучше:
$str !== ''
См. также: Проверка того, пуста ли строка и Есть ли разница между $str == '' и strlen($str ) == 0 в PHP?
Они довольно близки, за исключением того, что strlen()
вернет 0
для NULL
строк, поэтому, если ваше $str
было NULL
, выражение 0 !== strlen($str)
в вашем первом тесте будет оцениваться как true
, а '' !== $str
во втором тесте будет оцениваться как false
.
is_string(null)
возвращает false
, поэтому оба выражения в любом случае вернут false
.
- person NullUserException; 03.12.2011
empty
заключается в том, что empty('0')
это true
.
- person Matt Ball; 03.12.2011
да они одинаковые..
Я хотел бы использовать:
is_string($str) && strlen($str) > 0
strlen
, но я проверил его с точки зрения производительности, и они были настолько близки, что было трудно сказать, что быстрее.
- person ryanve; 03.12.2011
Попробуй это
strlen($str) > 0
!== является сильным типом и может не соответствовать 0 должным образом.
$str
является строкой.
- person Wouter Dorgelo; 03.12.2011
!=
может что-то сломать, но !==
кажется нормальным. Что ты имеешь в виду?
- person ryanve; 03.12.2011
is_string($str) && '' !== $str
является избыточным, поскольку вы тестируете !==, который уже проверяет, что $str имеет тот же тип, что и ''. - person macjohn   schedule 03.12.2011strlen(false)
иstrlen(null)
оба оцениваются как 0. Это гарантирует, что$str
на самом деле является строкой. - person ryanve   schedule 03.12.2011is_string($str)
часть второго теста избыточна. - person Matt Ball   schedule 03.12.2011$str
может быть нестроковым типом, таким как массив или логическое значение. - person ryanve   schedule 03.12.2011echo strlen(array());
. Это 5 b/c, он преобразует массив в «Массив». - person ryanve   schedule 03.12.2011