PHP имеет привычку оценивать (int) 0 и (string) "0" как пустые при использовании функции empty()
. Это может иметь непредвиденные результаты, если вы ожидаете числовые или строковые значения 0. Как я могу "исправить" его, чтобы возвращать true только пустым объектам, массивам, строкам и т.д.?
Фиксирование пустой функции PHP
Ответ 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.