Prüfen, ob eine Variable NULL ist

Wie eine Variable in PHP auf NULL getestet werden kann

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.

($var == null) sollte nicht statt ($var === null) verwendet werden, da es zum Beispiel auch bei 0, false und leeren Strings das Ergebnis true (boolean) erzeugt. ($var === null) hingegen gibt wirklich nur dann true zurück, wenn $var gleich NULL ist.

2. Beispiel: is_null($var), isset($var) und ($var === null) im Vergleich

PHP-Code
<?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
?>

HTML-Code: Ausgabe
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-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-Code
<?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
?>

HTML-Code: Ausgabe
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-Code
<?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
?>

HTML-Code: Ausgabe
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-Code
<?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");
?>

HTML-Code: Ausgabe
Zeitbedarf is_null($var): 2.5165240764618s 
Zeitbedarf ($var === null): 0.85995101928711s 



Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0