PHP лучший способ проверить, является ли строка пустой или нет

Я видел много php-кода, который выполняет следующие действия, чтобы проверить правильность строки:

$ str – строковая переменная.

if (!isset($str) || $str !== '') { // do something } 

Я предпочитаю просто делать

 if (strlen($str) > 0) { // something } 

Есть ли что-то, что может пойти не так во втором методе? Должны ли быть какие-то вопросы о литье?

 if(empty($stringvar)) { // do something } 

Вы также можете добавить trim() чтобы исключить пробелы, если это необходимо учитывать.

Редактировать:

Обратите внимание, что для строки типа « 0 » это вернет true, а strlen() не будет.

Вам нужно isset() в случае, если $str возможно не определена:

 if (isset($str) && $str !== '') { // variable set, not empty string } 

Использование !empty() будет иметь важное оговорку: строка '0' оценивается как false .

Кроме того, иногда хочется проверить, кроме того, что $str не является чем-то ложным, например false или null [1]. Предыдущий код не справляется с этим. Это одна из редких ситуаций, когда может быть полезно свободное сравнение:

 if (isset($str) && $str != '') { // variable set, not empty string, not falsy } 

Вышеупомянутый метод интересен, поскольку он остается кратким и не отфильтровывает '0' . Но не забудьте документировать свой код, если вы его используете.

В противном случае вы можете использовать эту эквивалентную, но более подробную версию:

 if (isset($str) && (string) $str !== '') { // variable set, not empty string, not falsy } 

Конечно, если вы уверены, что $str определен, вы можете опустить isset($str) из приведенных выше кодов.

Наконец, учитывая, что '' == false , '0' == false , но '' != '0' , вы, возможно, догадались: сравнения PHP не являются транзитивными (включая графические диаграммы удовольствия).

[1] Обратите внимание, что isset() уже отфильтровывает значение null .

Это безопасно проверит строку, содержащую только пробелы:

 // Determines if the supplied string is an empty string. // Empty is defined as null or containing only whitespace. // '0' is NOT an empty string! function isEmptyString($str) { return !(isset($str) && (strlen(trim($str)) > 0)); } 

Как насчет этого:

 if( !isset($str[0]) ) echo "str is NULL or an empty string"; 

Я нашел его в руководстве PHP в комментарии Антоне Раунди

Я разместил его здесь, потому что я сделал несколько тестов и, похоже, хорошо работал, но мне интересно, есть ли какой-то побочный эффект, который я не рассматриваю. Любые предложения в комментариях здесь будут оценены.


Редактировать:

Как отмечено Gras Double, когда $str является '0' код выше вернет true. Таким образом, это решение тоже не работает.

Согласно PHP empty () doc ( http://ca1.php.net/empty ):

До PHP 5.5 пустая () поддерживает только переменные; все остальное приведет к ошибке синтаксического анализа. Другими словами, следующее не будет работать: empty (trim ($ name)).

Вместо этого используйте trim ($ name) == false .

Если ваша переменная $str не определена, ваш метод strlen() выдаст исключение. В этом и заключается цель использования isset() .

Этот простой старый вопрос по-прежнему сложный.

strlen($var) отлично работает ТОЛЬКО, если вы абсолютно уверены, что $ var является строкой.

isset($var) и empty($var) результат основаны на типе переменной и могут быть сложными в некоторых случаях (например, пустая строка ""). Просмотрите таблицу на этой странице для получения более подробной информации.

ОБНОВИТЬ

На этот вопрос действительно два случая:

Случай 1: вы уверены, что ваша переменная всегда будет «строкой»:

В этом случае просто проверьте длину:

 if(strlen($str) > 0) { // do something.. } 

Случай 2: Ваша переменная может и не быть «строкой»:

В этом случае это зависит от того, что вы хотите сделать. Для меня (в большинстве случаев), если это не строка, я проверяю ее как «ложную». Вы можете сделать это следующим образом:

 if(is_string($var) && $var !== '') {// true only if it's a string AND is not empty // do something ... } 

И чтобы сделать его короче и в 1 состоянии вместо 2 (особенно полезно, если вы тестируете более 1 строки в том же состоянии, если это условие), я включил ее в функцию:

 function isNonEmptyString($var) { return is_string($var) && $var !== ''; } // Somewhere else.. // Reducing conditions to half if(isNonEmptyString($var1) && isNonEmptyString($var2) && isNonEmptyString($var3)) { // do something } 

Я думаю, что нет, потому что strlen (string lenght) возвращает длину (целое число) вашей переменной $ str. Поэтому, если переменная пуста, я бы вернул 0. Больше 0, чем 0. Не думайте так. Но я думаю, что первый способ может быть немного более безопасным. Потому что он проверяет, является ли переменная init, а если она не пустой.