PHP лучший способ проверить, является ли строка пустой или нет
Я видел много php-кода, который выполняет следующие действия, чтобы проверить правильность строки:
$str - строковая переменная.
if (!isset($str) || $str !== '') {
// do something
}
Я предпочитаю просто делать
if (strlen($str) > 0) {
// something
}
Есть ли что-то, что может пойти не так во втором методе? Есть ли какие-либо проблемы с кастом, о которых я должен знать?
Ответы
Ответ 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, а если она не пустой.