проверить строки длиной не менее 1 символа

Я часто вижу использование strlen. Являются ли эти 2 теста эквивалентными для всех значений $str?

is_string($str) && 0 !== strlen($str)

is_string($str) && '' !== $str


person ryanve    schedule 02.12.2011    source источник
comment
is_string($str) && '' !== $str является избыточным, поскольку вы тестируете !==, который уже проверяет, что $str имеет тот же тип, что и ''.   -  person macjohn    schedule 03.12.2011
comment
@macjohn это не лишнее, потому что strlen(false) и strlen(null) оба оцениваются как 0. Это гарантирует, что $str на самом деле является строкой.   -  person ryanve    schedule 03.12.2011
comment
@ryanve @macjohn говорит, что is_string($str) часть второго теста избыточна.   -  person Matt Ball    schedule 03.12.2011
comment
@MДΓΓ БДLL В любом случае это не лишнее. Учтите, что $str может быть нестроковым типом, таким как массив или логическое значение.   -  person ryanve    schedule 03.12.2011
comment
в первом случае, если $str не является строкой, и вы не проверяете, является ли $str строкой, strlen выдаст ошибку, так как она ожидает строку в качестве параметра. Во втором случае оператор !== проверяет и тип, и содержимое.   -  person macjohn    schedule 03.12.2011
comment
@macjohn Какой смысл делать это так, чтобы это могло вызвать ошибку? В любом случае это неправильно. Попробуйте echo strlen(array());. Это 5 b/c, он преобразует массив в «Массив».   -  person ryanve    schedule 03.12.2011
comment
Думайте, что концептуально, когда вы выполняете тест с $a !== $b, вы выполняете двойной тест: gettype($a) !== gettype($b) && $a != $b. В вашем примере gettype('') ​​!== 'string' && '' != $str   -  person macjohn    schedule 03.12.2011


Ответы (4)


Да, эти два утверждения логически эквивалентны. Мои предпочтительные способы снятия шкуры с этой кошки:

is_string($str) && !empty($str)

...хотя empty('0') это true (вздох, PHP...), так что, наверное, это даже лучше:

$str !== ''

См. также: Проверка того, пуста ли строка и Есть ли разница между $str == '' и strlen($str ) == 0 в PHP?

person Matt Ball    schedule 02.12.2011

Они довольно близки, за исключением того, что strlen() вернет 0 для NULL строк, поэтому, если ваше $str было NULL, выражение 0 !== strlen($str) в вашем первом тесте будет оцениваться как true, а '' !== $str во втором тесте будет оцениваться как false.

person Cᴏʀʏ    schedule 02.12.2011
comment
... но это в значительной степени не имеет значения, поскольку is_string(null) возвращает false, поэтому оба выражения в любом случае вернут false. - person NullUserException; 03.12.2011
comment
@NullUserException: Точно, просто наблюдение :) - person Cᴏʀʏ; 03.12.2011
comment
Большая проблема с empty заключается в том, что empty('0') это true. - person Matt Ball; 03.12.2011

да они одинаковые..

Я хотел бы использовать:

is_string($str) && strlen($str) > 0
person Wouter Dorgelo    schedule 02.12.2011
comment
Спасибо. Если они одинаковы, то зачем использовать тот, который требует дополнительного вызова функции? Я подумал, что, возможно, будет быстрее использовать strlen, но я проверил его с точки зрения производительности, и они были настолько близки, что было трудно сказать, что быстрее. - person ryanve; 03.12.2011

Попробуй это

strlen($str) > 0

!== является сильным типом и может не соответствовать 0 должным образом.

person Sean H Jenkins    schedule 02.12.2011
comment
Я предпочитаю проверять, действительно ли $str является строкой. - person Wouter Dorgelo; 03.12.2011
comment
@Palazzo Да, вы обязательно должны убедиться, что это строка. Я понял, что это имел в виду Шон. - person ryanve; 03.12.2011
comment
strlen() вел себя глупо до версии 5.3, если в качестве аргумента подавался массив. Вы получите длину 5, потому что массив приводится к строке «Массив». Так что это не идеальный способ убить двух зайцев одним выстрелом; вам все еще нужно убедиться, что это была строка. - person goat; 03.12.2011
comment
Да, я понимаю, что вы можете проверить строку, но это довольно просто. В то время как использование !== часто может привести к поломке - person Sean H Jenkins; 03.12.2011
comment
@Sean H Jenkins Я вижу, как != может что-то сломать, но !== кажется нормальным. Что ты имеешь в виду? - person ryanve; 03.12.2011
comment
Например, если у вас есть (int) 5 === (float) 5 = false Но (int) 5 == (float) 5 = true - person Sean H Jenkins; 03.12.2011