Hi!
Das stammt auch aus Zeiten, als es noch kein dediziertes true und false gab und man stattdessen 1 und 0 verwendete.
Das ist einleuchtend, meinetwegen auch noch 0 und -1, aber dass die nicht definierte Konstante "FAIL" z.B. auch nach true validiert ist etwas komisch - ich hätte erwartet, dass nicht gesetzte Variablen oder nicht definierte Konstanten nach false gecastet werden.
Schalte das error_reporting auf E_ALL, dann wird dir durch die nun angezeigten Notice-Meldungen bestimmt einiges klarer. Nicht vorhandene Variablen ergeben im boolschen Kontext false und die Konstanten ergeben true, weil bei denen noch ein anderer Mechanismus mit reinspielt.
Den schlechten Ruf unter erfahreneren Programmierern hat es sich durch seine Anfängerfreundlichkeit erarbeitet, weil es eben viel und manches recht ungewöhnlich automatisiert. Es gibt aber für alles eine Erklärung, egal ob man die nun gut findet oder nicht. Lesezugriffe auf nicht vorhandene Variablen ergeben null als Resultat, und das entspricht false. Dass nicht vorhandene Konstanten nach true evaluieren, liegt daran, dass PHP davon ausgeht, man wollte eigentlich einen String schreiben, also wird der Konstantenname als String angesehen und der evaluiert stets nach true, weil ein Konstantenname kein Leerstring oder 0 sein kann und false und null schon als Schlüsselwörter definiert sind. Vergleiche PHP type comparison table erste Tabelle, erste und letzte Spalte. Diesen String-Mechanismus braucht man um Anfängern solche Fehler wie $foo[bar] zu verzeihen, das eigentlich $foo['bar'] beziehungsweise $foo["bar"] hätte geschrieben werden müssen. (Es sei denn man ist in einem ""-String, da muss man die ''/"" weglassen "bla $foo[bar] fasel" oder extra noch mit {} klammern "bla {$foo['bar']} fasel" jedoch nicht beides zugleich, also mit {} aber ohne '' wie in "bla {$foo[bar]} fasel". Hier schlägt dann wieder der Konstantenmechanismus zu. Variable parsing)
Lo!