Я видел много 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, а если она не пустой.