Вопрос

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

Это было полезно?

Решение

У меня это не сработало.

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

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

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

Другие советы

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

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

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

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

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

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 года.

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

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

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

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

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

функция:

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

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

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

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

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

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

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

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

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


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

Не имеет значения, является ли переменная пустой или null, все это равно false при вводе условия if.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top