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

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

Solutions Collecting From Web of "Фиксирование пустой функции PHP"

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

 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, и он делает много смысла (не то, что я буду спорить здесь). Если вы хотите, чтобы нуль оценивался как истинный, используйте strlen($value) .

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

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

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

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

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

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

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

Я создал 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) ) {;} 

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

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

функция:

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

Я использовал функцию 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; } 

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

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

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