Tach!
Wie würdest Du denn auf die Existenz einer Variablen testen, die Null enthalten kann?
isset() liefert false, egal ob sie tatsächlich existiert oder nicht. is_null() antwortet genau entgegengesetzt und wirft zusätzlich eine Notice bei Nichtvorhandensein. Selbst mit einem @ davor ist is_null() allein unbrauchbar. isset() und is_null() zu kombinieren bringt nichts.
is_null() und Testen auf eine Fehlermeldung ist unpraktisch, weil die Aussage von error_get_last() nicht auf eine bestimmte Anweisung zurückgeführt werden kann. $php_errormsg kann man zwar löschen und anschließend auf Inhalt prüfen.
ini_set('track_errors', 1);
$php_errormsg = null; var_dump(@is_null($x) and !$php_errormsg);
Doch das kann man nicht in eine Funktion auslagern, weil beim Übergeben von nicht vorhandenen $x entweder eine Notice geworfen wird oder bei Übergabe als Referenz die Variable mit Inhalt null angelegt wird.
Bleibt am Ende wohl nur dieses Konstrukt:
var_dump(array_key_exists('x', get_defined_vars()) and is_null($x));
Das schaut in der aktuellen Variablenliste für den aktuellen Scope nach dem Vorhandensein des Namens der Variable und erst dann erfolgt der Test auf null. $GLOBALS statt get_defined_vars() schränkt auf den globalen Scope ein, ist also unbrauchbar. Zudem müssen andere Lösungen für Array-Elemente und Objekt-Eigenschaften gefunden werden, wenn man das braucht.
Apropos "braucht". Man braucht sowas eigentlich nicht. Nicht vorhandene Array-Elemente können nur in $_GET/$_POST/etc. vorkommen, und da ist null kein von PHP gesetzter Wert. Ansonsten hat man doch die Kontrolle über seine Variablen, oder man macht was falsch. (Zum Fehlersuchen bekommt man mit E_ALL und var_dump() eindeutige Aussagen.)
dedlfix.