Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Поскольку PHP будет обрабатывать строку, содержащую ноль ('0'), как пустую, это делает функцию empty() непригодным решением.

Вместо этого проверьте, что переменная явно не равна пустой строке:

$stringvar !== ''

Как показали OP и Gras Double и другие, переменная также должна быть проверена на инициализацию, чтобы избежать предупреждения или ошибки (в зависимости от настроек):

isset($stringvar)

Это приводит к более приемлемым:

if (isset($stringvar) && $stringvar !== '') {
}

В PHP много плохих соглашений. Я первоначально ответил на это (более 9 лет назад), используя функцию empty(), как показано ниже. Я давно отказался от PHP, но так как этот ответ привлекает отрицательные отзывы и комментарии каждые несколько лет, я обновил его. Если ОП желает изменить принятый ответ, сделайте это.

Оригинальный ответ:

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

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

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

Обратите внимание, что для такой строки, как ' 0 ', это вернет true, а strlen() - нет.

Ответ 2

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

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 не является переходным (fun графы).


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

Ответ 3

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

// 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));
}

Ответ 4

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

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

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

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


Edit:

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

Ответ 5

В соответствии с PHP empty() doc (http://ca1.php.net/empty):

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

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

Ответ 6

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

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

Результаты

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

UPDATE

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

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

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

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

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

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

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

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

function isNonEmptyString($var) {
    return is_string($var) && $var !== '';
}


// Somewhere else..
// Reducing conditions to half
if(isNonEmptyString($var1) && isNonEmptyString($var2) && isNonEmptyString($var3)) {
    // do something
}

Ответ 7

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

Ответ 8

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