Felix Riesterer: empty(KONSTANTE) führt zu Fehler?

Liebe PHP-Kenner,

warum erhalte ich in älteren Versionen (anscheinend < 5.4) einen Fehler bezüglich Schreibkontext, wenn ich dieses Konstrukt verwende?

if (empty(ini_get('date.timezone'))) {...}

Die Fehlermeldung erhalte ich ebenso, wenn eine Konstante im Spiel ist:

if (empty(SID)) {...} // SID ist eine Konstante

In beiden Fällen konnte ich Abhilfe schaffen, wenn ich einen Stringvergleich bemühe:

if (ini_get('date.timezone') == '') {...}  
if (SID == '') {...} // SID ist eine Konstante

Warum ist das so, und warum in PHP5.5 nicht mehr?

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  1. Om nah hoo pez nyeetz, Felix Riesterer!

    Liebe PHP-Kenner,

    bin ich zwar nicht, aber http://php.net/manual/de/function.empty.php

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Bar und Barren.

    1. Lieber Matthias Apsel,

      http://php.net/manual/de/function.empty.php

      vielen Dank ;-) Aber das hatte mir nicht vollumfänglich erklärt, _warum_ das so ist. Der inneren Logik der PHP-Syntax zufolge "erscheint" empty() als Funktion und nicht als Sprachkonstrukt (wie z.B. switch(), array() oder for()-/foreach()-/while()-Schleifen).

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Moin Felix,

    Warum ist das so, […]

    Weil PHP kaputt ist. empty() geht nur auf Variablen.

    und warum in PHP5.5 nicht mehr?

    Weil mit PHP 5.5 empty() repariert wurde, siehe auch die Feature-Liste.

    LG,
     CK

    1. Lieber Christian Kruse,

      Weil PHP kaputt ist. [...] Weil mit PHP 5.5 empty() repariert wurde

      es hätte für mich der Hinweis seitens php.net gereicht, empty() als Sprachkonstrukt auszuweisen. So hatte ich eine Funktion erwartet, die im Grunde jeden Audruck als Input verkraften muss. Aber danke für die technischen Hintergründe! Nun (also ab php5.5) kann ich zumindest bei empty() die Syntax für voll nehmen.

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Tach!

        es hätte für mich der Hinweis seitens php.net gereicht, empty() als Sprachkonstrukt auszuweisen.

        Der Hinweis ist im Handbuch enthalten.

        So hatte ich eine Funktion erwartet, die im Grunde jeden Audruck als Input verkraften muss.

        Eine Funktion bekommt nicht den Ausdruck übergeben, sondern nur dessen Ergebnis. Das bedeutet, dass der Ausdruck vorher aufgelöst werden muss. Und dabei werden Fehlermeldungen erzeugt, wenn Variablen nicht vorhanden sind. empty() (ebenso wie isset()) muss ein Sprachkonstrukt sein, damit es anders arbeiten kann als normale Funktionen.

        dedlfix.