Frage

PHP hat die Gewohnheit des Auswertens (int) 0 und (string) "0" als leer, wenn die empty() Funktion. Dies kann unbeabsichtigte Folgen haben, wenn Sie numerische oder String-Werte von 0. erwarten Wie kann ich „reparieren“, um es nur true zurück, um leere Objekte, Arrays, Strings, etc?

War es hilfreich?

Lösung

Das hat bei mir nicht funktioniert.

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

Früher habe ich statt:

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

Andere Tipps

Ich verwende empty() selten aus dem Grund, die Sie beschreiben. Es verwirrt legitime Werte mit Leere. Vielleicht ist es, weil ich eine Menge Arbeit in SQL tun, aber ich ziehe NULL verwenden, um das Fehlen eines Wertes zu bezeichnen.

PHP hat eine Funktion is_null(), die für eine variable oder Expression, während NULL testet.

$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";

Sie können auch den genau gleich Operator === verwenden einen ähnlichen Test zu tun:

if ($foo === null) print "foo is null!\n";

Dies gilt, wenn $foo NULL ist, aber nicht, wenn es false, null, "", etc.

"0" ist immer in Betracht gezogen falsch (oder leer) in PHP, und es macht eine Menge Sinn macht (nicht, dass ich werde argumentieren, dass hier). Wenn Sie haben wollen, als auch Null auf true zu bewerten, verwenden strlen($value).

„Fixing“ ist ein Gesichtspunkt. Eine andere wäre es nicht „gebrochen“ zu übernehmen, und lernt, mit ihm den Weg zur Arbeit wurde absichtlich entworfen.

Da das Problem, wie Sie es beschreiben, wäre das Beste, was Ihren Code zu verschärfen, so dass der Variable nicht in einen unbestimmten Typ Zustand versetzt werden kann. Andernfalls werden Sie für Datentyp mit gettype testen möchten ().

ich zu meiner Code-Basis immer hinzufügen

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

und verwenden Sie es anstelle von empty (). Sie löst das Problem von Nullen (int, float oder string) als nicht leer zu halten.

Siehe http://www.php.net/manual/en /function.empty.php#103756 , der Mai 2011 hinzugefügt wurde.

Im Allgemeinen Sie die dreifache equals Operator zu bestimmen, verwenden möchten, wenn wirklich ein Wert null oder falsch ist. Dies ist präziser und die Ergebnisse immer Rückkehr genau wie erwartet.

Erstellen eine separate Funktion, etwas zu tun, dass Sie in einer einzigen Zeile Code tun können, aber mit einem anderen Betreiber zu kompliziert zu sein scheint, und fügt zusätzliche Verschleierung.

Darüber hinaus neigen viele Programmierer 0 oder eine leere Zeichenfolge verwenden, um einen nicht vorhandenen Wert zu bezeichnen, aber es ist richtig (und ich fühle mich eine bessere Praxis) einen Nullwert zu verwenden, einen beliebigen Wert (unabhängig vom Typ) zu bezeichnen, ist wirklich nicht vorhanden.

Ich verwende diese Leere zu erkennen:

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

die Funktion:

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

Ich habe eine IsEmpty() höchstens eine knappe schnelle Funktion.

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

Sie versuchen empty() für etwas zu verwenden, für die es nicht gedacht. Ich persönlich denke, es das Verhalten von einem älteren Programmierparadigma in PHP kommt und es wahrscheinlich zurückgezogen werden könnte.

Stattdessen machen Ihre Schecks deutlicher. Anstatt zu überprüfen, ob der Wert nicht sinnvoll ist, prüfen Sie, dass es ist. wenn Sie ein Array zum Beispiel wollen, überprüfen Sie, es ist ein Array (is_array()) anstatt zu prüfen, ob es sich um eine Zeichenfolge ist.

Außerdem können Sie sich darauf verlassen, dass alle $_POST und $_GET Variablen Strings sind, so können Sie Vergleiche „“ machen, oder dass strlen() == 0 überprüfen.

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

benutzte ich ord Funktion zu überprüfen, entweder der übergebene Wert war leer ist oder nicht .

/*
* 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;
}

Die effektivste Lösung für dieses Problem besteht darin, zu prüfen, ob die Variable falsch z sind.


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

Es spielt keine Rolle, ob die Variablen leer oder null ist, es ist alles gleich zu falsch, wenn in einem, wenn bedingten setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top