PHP имеет привычку оценивать (int)0 и (string)"0" как пустые при использовании функции empty()
. Это может привести к непредвиденным результатам, если вы ожидаете, что числовые или строковые значения равны 0. Как я могу «исправить» это, чтобы возвращать true только для пустых объектов, массивов, строк и т. д.?
Исправление пустой функции PHP
- Лично я считаю, что (int)0 следует оценивать как false; просто (string)0 этого не должно быть. Также обратите внимание, что пустые объекты не считаются
empty()
, и принятый ответ не меняет этого. 24.07.2013 - @Brilliand - учитывая общий дизайн php, целые и числовые строки взаимозаменяемы, это, вероятно, не будет хорошим изменением. 25.02.2019
- ... ИМХО Было бы проще, если бы
empty
было ложным для значений, эквивалентных 0. Тогда это часто было бы полезно как есть; нам не нужны обходные пути, подобные этому Q&A. В тех случаях, когда кто-то хотел включить 0-эквиваленты, просто сделал быif (empty($var) || $var == 0)
. Ах хорошо. 25.02.2019
Ответы:
Это не сработало для меня.
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
, ноль, ""
и т. д.
isset
будет более подходящей заменой, чем is_null
. Если OP выбрал empty
вместо простого (вероятно, неявного) приведения к логическому значению, то я бы предположил, что переменная может быть неопределенной. 24.07.2013 is_null
, если, конечно, вы не хотите, чтобы $foo = ""
рассматривалось как NOT NULL. 01.01.2019 ""
совпадает с NULL, но это нестандартно. 01.01.2019 is_null
, это было бы так. 01.01.2019 "0" всегда считается ложным (или пустой) в PHP, и это имеет большой смысл (не то чтобы я буду спорить с этим здесь). Если вы хотите, чтобы нуль также оценивался как true, используйте strlen($value)
.
Я всегда добавляю в свою кодовую базу
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 г.
is_nothing()
вместо is_blank
, но это только я. 23.06.2021 "Исправление" - это одна точка зрения. Другим было бы предположить, что он не «сломан», и научиться работать с ним так, как он был намеренно разработан.
Учитывая проблему, как вы ее описываете, лучше всего было бы усовершенствовать ваш код, чтобы переменная не могла быть помещена в состояние неопределенного типа. В противном случае вам нужно проверить тип данных с помощью gettype().
Вообще говоря, вы хотите использовать оператор тройного равенства, чтобы определить, действительно ли значение является нулевым или ложным. Это более конкретно, и результаты ВСЕГДА возвращаются точно так, как ожидалось.
Создание отдельной функции для выполнения чего-то, что вы можете сделать в одной строке кода, но с использованием другого оператора кажется слишком сложным и добавляет дополнительную запутанность.
Кроме того, многие программисты, как правило, используют 0 или пустую строку для обозначения несуществующего значения, но более правильно (и я считаю это лучшей практикой) использовать нулевое значение для обозначения любого значения (независимо от типа), которое действительно не существует. -существующий.
Вы пытаетесь использовать empty()
для чего-то, для чего он не предназначен. Лично я думаю, что это поведение исходит из более старой парадигмы программирования в PHP, и его, вероятно, можно было бы удалить.
Вместо этого сделайте свои проверки более явными. Вместо того, чтобы проверять, является ли значение бесполезным, убедитесь, что оно полезно. Например, если вам нужен массив, проверьте, является ли он массивом (is_array()
), а не строкой.
Кроме того, вы можете полагаться на тот факт, что все переменные $_POST
и $_GET
являются строками, поэтому вы можете сравнивать их с "" или проверять, что strlen() == 0
.
NULL
23.12.2019 Я использую это для обнаружения пустоты:
'' --> true
'0' --> false
0 --> false
функция:
function is_empty_or_zero($str) {
return (is_null($str) || ($str === ''));
}
is_empty_or_zero
не подходит для этой функции. is_null_or_empty_string
это то, что вы тестируете. В частности, ноль возвращает false. Возможно, вы имели в виду is_empty_but_not_zero
как имя; хотя это не так хорошо, как прямо говорить о своих намерениях. Другой подход состоит в том, чтобы определить противоположное (отрицание) этой функции и назвать ее has_contents
. if (!has_contents(...))
вполне читабельно, ИМХО. 25.02.2019 Я создал IsEmpty()
краткую быструю функцию.
function IsEmpty($mData) {
return is_int($mData) ? false :
is_string($mData) ? $mData=="" :
empty($mData);
}
Я использовал функцию 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;
}
is_numeric
, как в ответе Стемара? 24.02.2019 Если вам нужен эквивалент empty($var)
, который возвращает false, когда var является строкой 0, вы можете использовать:
if (($var ?? 0) != '')
Причина, по которой это работает:
$var ?? 0
— это ярлык для тернераisset($var) ? $var : 0
. То есть, если переменная слева не существует, она принимает значение справа без выдачи предупреждения или уведомления, как в случае с isset() или empty().<value> != ''
выполняет неявное приведение пустой строки, когда левое значение не является строкой. Это возвращает false для любого ложного значения<value>
, такого как null, false или (числовое) 0. Однако для строки 0 это вернет true, поскольку приведение не будет выполнено, а"0" != ""
истинно.
Наиболее эффективное решение этой проблемы - проверить, является ли переменная ложной, например.
if (!$variable_name) {echo $variable_name;}
Неважно, является ли переменная пустой или нулевой, все равно ложно, если вводится в условие if.
is_numeric
, как в ответе Стемара? 25.02.2019
!=
вместо!==
.(empty($variable) && $variable !== '0')
на самом деле был бы хорошим и кратким способом проверить это. 30.09.2014" 0"
,"00"
или"-0"
. Они не будут обнаружены!== '0'
, но имеют содержимое. Хороший пример того, почему нужно писать код, говорящий о ваших намерениях, а не умничать. 24.02.2019