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

Фиксирование пустой функции PHP

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

4b9b3361

Ответ 1

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

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

Вместо этого я использовал:

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

Ответ 2

Я редко использую 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, ноль, "" и т.д.

Ответ 3

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

Ответ 4

"Фиксация" - одна точка зрения. Другим было бы предположить, что он не "сломан" и научится работать с ним так, как это было намеренно спроектировано.

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

Ответ 5

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

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

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

Ответ 6

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

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 г.

Ответ 7

Я создал IsEmpty() краткую быструю функцию.

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}

Ответ 8

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

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

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

Ответ 9

if ( is_int($val) || !empty($val) ) {;}

Ответ 10

Я использую это для обнаружения пустоты:

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

функция:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}

Ответ 11

Я использовал 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;
}

Ответ 12

Наиболее эффективным решением этой проблемы является проверка, является ли переменная ложной, например.


if (!$variable_name) {echo $variable_name;}

Не имеет значения, пустая или пустая переменная, все равно false, если положить в условное условие if.