Исправление пустой функции PHP - PullRequest
27 голосов
/ 04 января 2009

PHP имеет привычку оценивать (int) 0 и (string) «0» как пустые при использовании функции empty(). Это может привести к непредвиденным результатам, если вы ожидаете, что числовые или строковые значения равны 0. Как я могу «исправить» его, возвращая true только пустым объектам, массивам, строкам и т. Д.?

Ответы [ 12 ]

37 голосов
/ 04 января 2009

Это не сработало для меня.

if (empty($variable) && '0' != $variable) {
  // Do something
}

Я использовал вместо:

if (empty($variable) && strlen($variable) == 0) {
  // Do something
}
19 голосов
/ 04 января 2009

Я редко использую empty() по той причине, которую вы описываете. Это путает законные ценности с пустотой. Может быть, это потому, что я много работаю в SQL, но я предпочитаю использовать NULL для обозначения отсутствия значения.

В PHP есть функция is_null(), которая проверяет, является ли переменная или выражение NULL.

$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n"; 
else print "integer 0 foo is not null!\n";

$foo = "0";
if (is_null($foo)) print "string '0' is null!\n"; 
else print "string '0' is not null!\n";

$foo = "";
if (is_null($foo)) print "string '' is null!\n"; 
else print "string '' is not null!\n";

$foo = false;
if (is_null($foo)) print "boolean false is null!\n"; 
else print "boolean false is not null!\n";

Вы также можете использовать оператор равных ===, чтобы выполнить аналогичный тест:

if ($foo === null) print "foo is null!\n";

Это верно, если $foo равно NULL, но не если это false, ноль, "" и т. Д.

7 голосов
/ 04 января 2009

"0" всегда считается ложным (или пустым) в PHP, и это действительно имеет большой смысл (не то, чтобы я утверждал, что здесь). Если вы также хотите, чтобы значение равно нулю, используйте strlen($value).

4 голосов
/ 08 мая 2011

Я всегда добавляю в свою кодовую базу

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

и используйте его вместо empty (). Это решает проблему хранения нулей (int, float или string) как непустых.

См. http://www.php.net/manual/en/function.empty.php#103756, который был добавлен в мае 2011 года.

4 голосов
/ 04 января 2009

«Крепление» это одна точка зрения. Другой - предположить, что он не «сломан», и научиться работать с ним так, как это было задумано.

Учитывая проблему, как вы ее описали, лучше всего было бы сжать ваш код, чтобы переменная не могла быть переведена в неопределенное состояние типа. В противном случае вы можете проверить тип данных, используя gettype ().

3 голосов
/ 04 января 2009

Вообще говоря, вы хотите использовать оператор тройного равенства, чтобы определить, действительно ли значение равно нулю или ложно. Это более конкретно, и результаты ВСЕГДА возвращаются точно так, как ожидалось.

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

Кроме того, многие программисты склонны использовать 0 или пустую строку для обозначения несуществующего значения, но более правильно (и я считаю, что лучше) использовать нулевое значение для обозначения любого значения (независимо от типа), которое действительно не существует.

1 голос
/ 05 апреля 2016

Я использую это, чтобы обнаружить пустоту:

''  --> true
'0' --> false
0   --> false

функция:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}
0 голосов
/ 06 мая 2016

Я использовал функцию ord, чтобы проверить, было ли переданное значение пустым или нет.

/*
* SPACE is not empty - Please do trim before using this function for your own purpose
*  var_dump(is_having_value(0));        // true
   var_dump(is_having_value(0000));     // true
   var_dump(is_having_value("    0"));  // true
   var_dump(is_having_value(""));       // false
   var_dump(is_having_value("  "));     // true
   var_dump(is_having_value('\t'));     // true
   var_dump(is_having_value(''));       // false
   var_dump(is_having_value('o'));      // true
   var_dump(is_having_value('O'));      // true
   var_dump(is_having_value('0'));      //true
   var_dump(is_having_value(null));     //false
   var_dump(is_having_value());         //false
*/
function is_having_value($val = null) {
    if (is_array($val) || is_object($val)):
        $logic_empty = empty($val);
        return !$logic_empty;
    else:
        $ascii = ord($val);
        if ($ascii == 48 || $ascii = 0 || $ascii == 32):
            return true;
        else:
            $logic_empty = empty($val);
            return !$logic_empty;
        endif;
    endif;
}
0 голосов
/ 09 января 2014
if ( is_int($val) || !empty($val) ) {;}
0 голосов
/ 05 января 2009

Вы пытаетесь использовать empty() для чего-то, для чего оно не предназначено. Лично я думаю, что это поведение происходит от более старой парадигмы программирования на PHP и, вероятно, может быть удалено.

Вместо этого сделайте ваши чеки более явными. Вместо того, чтобы проверять, является ли значение бесполезным, убедитесь, что оно есть. Например, если вам нужен массив, проверьте, что это массив (is_array()), а не проверяете, является ли он строкой.

Кроме того, вы можете полагаться на тот факт, что все переменные $_POST и $_GET являются строками, поэтому вы можете сравнить их с "" или проверить, что strlen() == 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...