1. Erläuterungen
NULL steht für eine Variable ohne Wert. Um zu prüfen, ob eine Variable NULL ist können entweder is_null($var) oder der Vergleich (===) mit NULL verwendet werden. Beide Wege erzeugen jedoch eine Warnung, wenn die Variable nicht definiert ist. Thematisch ähnlich sind die Sprachkonstrukte isset($var) und empty($var), die weitestgehend wie Funktionen verwendet werden können. isset($var) ergibt true (boolean), wenn die übergebene Variable definiert ist und einen Wert ungleich NULL enthält. empty($var) ergibt true (boolean), wenn die übergebene Variable nicht definiert ist oder einen leeren Wert enthält. Dabei ist „leer” sehr allgemein definiert und umfasst etwa auch 0 (Integer), false (boolean) oder den leeren String.
2. Beispiel: is_null($var), isset($var) und ($var === null) im Vergleich
<?php // alle Warnungen anzeigen, damit wir die Warnungen sehen // die generiert werden, wenn man is_null() und === auf eine nicht // existierende Variable anwendet error_reporting(E_ALL); $var = null; echo('Fuer $var mit Wert NULL:' . "\n\n"); var_dump(is_null($var)); // true var_dump($var === null); // true var_dump(!isset($var)); // true var_dump(empty($var)); // true echo("\n\n"); echo('Fuer nicht definierte Variable $notset:' . "\n\n"); var_dump(is_null($notset)); // true, Erzeugt Notice var_dump($notset === null); // true, Erzeugt Notice var_dump(!isset($notset)); // true var_dump(empty($notset)); // true ?>
Fuer $var mit Wert NULL: bool(true) bool(true) bool(true) bool(true) Fuer nicht definierte Variable $notset: <br /> <b>Notice</b>: Undefined variable: notset in <b>...\test.php</b> on line <b>20</b><br /> bool(true) <br /> <b>Notice</b>: Undefined variable: notset in <b>...\test.php</b> on line <b>21</b><br /> bool(true) bool(true) bool(true)
3. Vergleich der Ergebnisse von is_null(), ===, isset() und empty()
Die nachfolgende Tabelle stellt die Unterschiede zwischen is_null(), ===, isset() und empty() dar:
NULL | false (Boolean) | 0 (Integer) | 0.0 (Float) | "" (String) | "0" (String) | |
---|---|---|---|---|---|---|
is_null($var) | true | false | false | false | false | false |
($var === null) | true | false | false | false | false | false |
isset($var) | false | true | true | true | true | true |
empty($var) | true | true | true | true | true | true |
Erzeugt wurde die Tabelle mit folgendem Code:
<?php $vars = array(null, false, 0, 0.0, '', '0'); $options = array('is_null($var)', '($var === null)', 'isset($var)', 'empty($var)'); $result = null; ?> <table id="null-conversion-table"> <thead> <tr> <th></th> <th>NULL</th> <th>false (Boolean)</th> <th>0 (Integer)</th> <th>0.0 (Float)</th> <th>"" (String)</th> <th>"0" (String)</th> </tr> </thead> <tbody> <?php foreach ($options as $option): ?> <tr> <td><?php echo $option; ?></td> <?php foreach ($vars as $var): ?> <?php eval('$result = ' . $option . ';'); ?> <td><?php echo ($result == true ? 'true' : 'false'); ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> </tbody> </table>
4. Array-Werte auf NULL prüfen
Um zu überprüfen, ob ein bestimmter Schlüssel eines Arrays existiert, aber NULL ist, kann eine Kombination aus is_null() und der Funktion array_key_exists($schluesselName, $array) verwendet werden. Über array_key_exists wird dann ermittelt, ob der Schlüssel gesetzt ist und über is_null ob er NULL ist.
<?php $arr = array(0 => 'test', 1 => null, 2 => 'bla'); var_dump(array_key_exists(0, $arr) && is_null($arr[0])); // false var_dump(array_key_exists(1, $arr) && is_null($arr[1])); // true var_dump(array_key_exists(2, $arr) && is_null($arr[2])); // false // Test auf nicht existierenden Schluessel: // (da array_key_exists hier bereits false ergibt, wird is_null nie ausgefuehrt und erzeugt keine Notice) var_dump(array_key_exists(3, $arr) && is_null($arr[3])); // false ?>
bool(false) bool(true) bool(false) bool(false)
5. Ermitteln, ob eine Variable definiert wurde und gleichzeitig NULL ist
Mit keinem der vorgestellten Wege lässt sich zuverlässig prüfen, ob eine Variable bereits definiert wurde, aber gleichzeitig NULL ist. is_null($var), ($var === null), !isset($var) und empty($var) geben alle auch dann true zurück, wenn die Variable noch nicht definiert wurde. In den allermeisten Fällen ist dies unproblematisch. Sollte man doch einmal wissen müssen, ob die Variable definiert wurde dann kann zusätzlich get_defined_vars() abgefragt werden, welche Namen und Werte aller definierten Variablen enthält:
<?php $notNull = 'foo'; $isNull = null; var_dump(array_key_exists('notNull', get_defined_vars()) && is_null($notNull)); // false var_dump(array_key_exists('isNull', get_defined_vars()) && is_null($isNull)); // true var_dump(array_key_exists('neverSet', get_defined_vars()) && is_null($neverSet)); // false ?>
bool(false) bool(true) bool(false)
6. Performance is_null($var) vs. $var === null
Im allgemeinen ist ($var === null) schneller als is_null($var), da bei is_null($var) erst eine Funktion aufgerufen werden muss. Der unterschiedliche Zeitbedarf wird allerdings erst bei sehr vielen Aufrufen offensichtlich.
<?php $timeIsNull = 0; $timeEqEqEq = 0; $var = null; $iterations = pow(10, 7); // 1 Million mal $start = microtime(true); for ($x=0; $x<$iterations; $x++) { is_null($var); } $timeIsNull = microtime(true) - $start; $start = microtime(true); for ($x=0; $x<$iterations; $x++) { ($var === null); } $timeEqEqEq = microtime(true) - $start; echo("Zeitbedarf is_null(\$var): " . ($timeIsNull) . "s \n"); echo("Zeitbedarf (\$var === null): " . ($timeEqEqEq) . "s \n"); ?>
Zeitbedarf is_null($var): 2.5165240764618s Zeitbedarf ($var === null): 0.85995101928711s