2014-12-09 7 views
24

Hinweis - ich weiß ziemlich viel über empty() und isset(), was ich frage ist die richtige/effizienter Weg, um sie zu verwenden.Ist leer() genug oder verwenden Sie isset()?

Ich habe gerade gesehen, um php.net diesen Satz unter empty() Referenz:

keine Warnung erzeugt, wenn der Variable nicht existiert. Das bedeutet leer() ist im Wesentlichen das genaue Äquivalent zu ! Isset ($ var) || $ var == falsch.

Aber noch einmal, wie ich vor allem jetzt arbeite auf anderer Leute apps (entweder eigenständige Projekte, Websites cms oder sogar Frameworks) viele, viele Male habe ich gesehen, wie Menschen zu schreiben:

if (isset ($var) && $var != '') 
// or 
if (isset ($var) && !empty($var)) 

(vor allem mit $ _GET und $ _POST Variablen, aber nicht nur)

Soweit ich Handbuch verstehen, unter snippet entspricht:

if (!empty($var)) 

Oder fehlt mir etwas? Was ist technisch der beste Weg, die Existenz von Variablen mit Wert zu überprüfen?

Ich kenne beide Funktionen, ihre Ziele. Ich will nur wissen, ob empty() alle zu überprüfen benötigt wird, wenn die Variable gesetzt ist und Wert gegeben. Ich weiß, dass es funktioniert, aber ist es 100% richtig und sicher?

+1

Antwort ist 'zu bejahen ist. –

+0

'empty()' ist der bevorzugte Weg –

+0

Ich benutze immer leer, weil ich nicht überprüfen muss, ist es gesetzt oder nicht, aber sei vorsichtig! Zum Beispiel, wenn Sie eine Texteingabe validieren wollen, und ich muss sicher sein, es ist nur gefüllt, spielt keine Rolle, was drin ist, verwenden Sie "isset" und "strlen", weil 0 wird für leer zurückgeben. – vaso123

Antwort

19

Op-Codes von isset($var) && !empty($var)

line  # * op       fetch   ext return operands 
--------------------------------------------------------------------------------- 


    3  0 > EXT_STMT             
     1  ISSET_ISEMPTY_VAR      12800000 ~0  !0 
     2 > JMPZ_EX          ~0 ~0,  ->6 
     3 > ISSET_ISEMPTY_VAR      11800000 ~1  !0 
     4  BOOL_NOT          ~2 ~1 
     5  BOOL           ~0 ~2 
     6 > FREE            ~0 
    4  7 > RETURN            1 

erzeugt und von !empty($var)

line  # * op       fetch   ext return operands 
--------------------------------------------------------------------------------- 
    3  0 > EXT_STMT             
     1  ISSET_ISEMPTY_VAR      11800000 ~0  !0 
     2  BOOL_NOT           ~1  ~0 
     3  FREE              ~1 
    4  4 > RETURN              1 

Also ja, es ISSET_ISEMPTY_VAR wiederholt sich aber! $empty. Es hängt von dem übergebenen Wert ab, aber es existiert nicht der obere Weg ist ein Opcode weniger BOOL_NOT. aber wenn es existiert, ist der untere Weg schneller.

Obwohl seine unwahrscheinlich das wird ein Engpass in jeder Anwendung

+0

Ich werde später einen Blick darauf werfen Ich bin mir nicht sicher, wie gut sie sich doch erholen werden – exussum

4

isset wird Ihnen einfach sagen, ob die Variable gesetzt ist, unabhängig von dem Wert (null, falsch etc.).

Wenn Sie den Wert testen möchten, ist keine leere Zeichenfolge, null, false oder 0 empty.

+0

bedeutet "isset" bedeutet "exists"? – Banzay

+3

@Banzay bedeutet "Variable ist deklariert und ist nicht null" – Forien

13

empty ist ausreichend, aber hüte dich vor den Folgen.

Wenn $var eines von 0, '0', false, '', [], null (und vielleicht ein paar andere, die ich vergessen), dann wird es isset sicherlich in Betracht gezogen werden, aber es wird auch empty sein. Beachten Sie, dass Zeichenfolge '0' ist ein besonderer Fall ist.

Persönlich verwende ich nur isset. Wenn ein Wert, der erforderlich ist empty nicht zu sein, werde ich dann, dass separat überprüfen und einen Fehler aus (die durch geeignete Fehlerbehandlungsblocks aufgefangen wird), um dem Benutzer ein einfacher, präzise zu geben, Fehler „Dieser Wert ist erforderlich“.

+1

(Randbemerkung, warum in der Welt 'NaN' in PHP als truthy Wert angesehen wird) –

+0

Was ist' NaN' in PHP? –

+1

'NaN' existiert nicht in PHP, nur Javascript ;-) – fire

3

Wenn Sie! (Leer ($ var) verwenden, wird die Variable gesetzt und enthält einen Wert, der leer sein kann wie "" oder null oder 0).

if(!empty($_COOKIE['dev'])) echo 'developer mode'; 

Wenn der Cookie entweder leer oder mit einem beliebigen Wert gefüllt ist, ist die Bedingung wahr. Sonst wird es ignoriert.

Das ist nützlich, wenn Sie mit Arrays arbeiten und nicht wissen, ob der Schlüssel gesetzt ist, um Warnungen zu vermeiden.

3

sein, wenn Sie $ _POST und $ _GET die Differenz zwischen bewerten isset und isempty nützlich ist. Wie Sie sagten, nicht leer() var bedeutet, dass ISset UND der Wert wie gesendet wurde.

So

if (!empty($var)) 

ist ceratinly genug für

if (isset ($var) && $var != '') 

, was Sie vermissen manchmal nur das ist

if (isset($var)) { 
    if ($var != '') { 

    } else { 
    ... do "A" 
    } 
} else { 
    ... do something different from "A" 
} 

Sie diese benötigen. Und wenn dies oft passiert, wenn es nicht passiert, werden Sie nur die beiden Bedingungen zusammenführen und leer vergessen(). Wie Sie bereits gefunden haben. Ich denke, dass die Verwendung von "leer" vielleicht schneller ist, aber intern macht es wahrscheinlich die gleichen Prüfungen.

2

GET/POST/COOKIE-Variablen sollten mit filter_input Funktion überprüft werden. Diese Funktion kann überprüfen, ob der angegebene Schlüssel in der Eingabe vorhanden ist (GET/POST/COOKIE/etc) und optional filtern. Beispiel:

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); 
/* 
* QUERYSTRING   RESULT 
* ================== =============== 
* test.php?    $id is NULL 
* test.php?id=   $id is FALSE 
* test.php?id=123abc $id is FALSE 
* test.php?id=123  $id is int(123) 
*/ 
if ($id !== NULL && $id !== FALSE) { /*...*/ } 

Die empty() Funktion auf der anderen Seite nur überprüft, ob eine Variable nicht gesetzt ist oder sein Wert ist falsy. Diese Funktion kann nicht in Situationen eingesetzt werden, wo falsy Werte sinnvoll:

if (empty($_GET["number_of_children"])) { 
    /* 
    * GET parameter is not set or its value is zero or falsy 
    * Show an error? Or process the value? 
    */ 
} 
if (empty($_GET["number_of_children"]) === false) { 
    /* 
    * Definitely a truthy value 
    * But how does one specify that he/she has no children? 
    */ 
}