Anomalie oder Einlesefehler der PHP Syntax?

12. März 2012 Besucher gesamt: 1374

Refactoring macht mir viel Spaß. Das hat viele Gründe: man sieht wie andere Programmierer bestimmte Probleme gelöst haben, man sieht wie Sachen gemacht oder besser nicht gemacht werden sollen, man arbeitet mit altem Code. Dabei sind mir schon einige kuriose Codefragmente aufgefallen wo ich schmunzeln musste. Aktuell stehe ich vor einem Codefragment wo ich mich erst fragen muss – ob so was überhaupt ge-parsed werden kann. Hier das Codefragment in einer vereinfachten Art und Weise:

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', true);

//try
{

  $conan = 1;
  $power = 1;

  print ($conan + $power).PHP_EOL;
}
//catch (Exception $e)
{
  // do nothing ...
}

In das oben aufgeführte Beispiel, hat man nur das „try“ und „catch“ auskommentiert. Häää?! Ich verstehe leider nicht, was hier die Absicht des Programmierers war – aber gut. Habe den Script mit „php -l“ nach PHP Einlesefehler geprüft. Ergebnis – alles OK!!! Habe das Script ausgeführt. Ergebnis – wieder alles OK!!! Wie ist es möglich, dass solch eine Syntax funktioniert? Woher kommt das? Ist das eine Anomalie oder Absicht im PHP?

¬ geschrieben von gjerokrsteski in PHP Tricks und Tipps  ¬ Erzähl´s weiter Twitter  | Mr. Wong  | Delicious  | Del.icio.us  | Google  | Facebook

«

» 

15 Kommentare zu 'Anomalie oder Einlesefehler der PHP Syntax?'

  1. Oliver sagte am 12. März 2012 um 12:58 Uhr:

    Funktioniert das noch, wenn man die Kommentare weg macht? Also { … } { … }

  2. Karl sagte am 12. März 2012 um 13:17 Uhr:

    Das ist eher Absicht als Anomalie. Man kann Statements mittels geschweifter Klammern zu Blöcken zusammenfassen.

  3. Christopher Schramm sagte am 12. März 2012 um 13:22 Uhr:

    Das ist einfach ein Block. In vielen Sprachen bedeutet das einen eigenen Scope, in PHP aber nicht. Wozu es überhaupt existiert in PHP, weiß ich nicht, aber es ist gültig und bedeutet schlussendlich nichts.

    Das Auskommentieren von try und catch führt dazu, dass zunächst der try-Block ganz normal ausgeführt wird, allerdings ohne Fangen von Ausnahmen. Anschließend wird aber auch der catch-Block ausgeführt! Wenn dort etwas stünde, hätte man also ein fehlerhaftes Resultat.

  4. Stefan sagte am 12. März 2012 um 13:24 Uhr:

    Das ist eine normale Funktionalitaet.
    Variablen, die innerhalb dieser Bloecke definiert werden, haben auch nur dort ihren Gueltigkeitsbereich (also wie innerhalb von Funktion oder anderen Bloecken auch)

  5. wolxXx sagte am 12. März 2012 um 13:35 Uhr:

    geschweifte klammern sind in php abgrenzungen. das gibt es in der java-welt auch. damit werden code-blöcke definiert. diese können eine schleife, condition, klassendefinition oder funktion umschließen. aber halt auch quellcode in mehr oder weniger deutlicher herausstellen.
    {} ist genau so möglich wie {echo „hallo welt, ich bin in zwei klammern versteckt“}
    über sinn und unsinn möchte ich an dieser stelle nichts sagen :)

    ps: auch leere statements wie
    ;
    sind möglich!

  6. Max sagte am 12. März 2012 um 13:59 Uhr:

    Ein Kollege von mir mochte es große Scripte in riesige Dateien zu schreiben. Der hat die Blocksyntax genutzt um mittels des Codefoldings seiner IDE Übersicht über seine Zigtausendzeilendateien zu halten. Kein schöner Stil aber durchaus funktionierend…

  7. Christopher Schramm sagte am 12. März 2012 um 17:54 Uhr:

    @Stefan: Nein, das ist nicht so. Das ist übrigens auch z. B. bei Schleifen in PHP nicht der Fall. Darin gesetzte Variablen sind auch später weiter gültig.

  8. Stefan sagte am 12. März 2012 um 19:14 Uhr:

    @Christopher: ah ok. War mir noch aus Urzeiten so in Erinnerung, aber war wohl ein Falsch zugeordneter Gedaechtnisfetzen.

  9. Bob sagte am 12. März 2012 um 19:16 Uhr:

    Viel lustiger finde ich dass folgendes problemlos geparsed wird:

    $a = ‚blubb‘;
    1234566789890;
    „Einfach mal noch ein String die nichts macht^^“;
    echo $a;

    Würde lediglich „blubb“ ausgeben. Es wird auch keine Notice erzeugt.

  10. Dennis Becker sagte am 13. März 2012 um 14:19 Uhr:

    Die geschweiften Klammern haben noch einen ganz anderen Zweck. Am Besten zeig ich das an einem Beispiel:

    $wurst = „foo“;
    class Bar
    {
    protected $bar = 1;

    public function foo()
    {
    return $this->bar;
    }
    }

    $bar = new Bar();
    echo $bar->{$wurst}();

    Ich glaube, neuere PHP Versionen können das auch ausführen ohne die geschweiften Klammern, bin mir da aber nicht sicher.

  11. nikosch sagte am 14. März 2012 um 03:51 Uhr:

    @Bob: Warum auch nicht? Das sind alles Ausdrücke. Rückgaben von Ausdrücken werden nicht automatisch ausgegeben – wäre ja auch noch schöner!

    Zum Block: Bin ich früher auch mal drüber gestolpert. Ich hatte auch überlegt, das fürs Codefolding zu mißbrauchen. Aber irgend ein Problem gabs damit. Entweder eine PHP-Version, die das nicht unterstützte oder ein Editor/eine IDE, die damit nicht klar kam.

  12. Burkhardt sagte am 22. März 2012 um 03:31 Uhr:

    Super neuer Beitrag! Ich werde da noch mal genauer recherchieren!

  13. Daniel sagte am 26. März 2012 um 17:05 Uhr:

    @Dennis: Ja, PHP 5 kann das auf jedenfall auch ohne die geschweiften Klammern ausführen. Bin mir allerdings nicht ganz sicher, aber welcher Version das genau eingefügt wurde. Es funktioniert auf jedenfall mit PHP 5.2 und PHP 5.3:

    bar;
      }
    }
    $bar = new Bar();
    echo $bar->$wurst();
    
  14. Daniel sagte am 26. März 2012 um 17:07 Uhr:

    @Gjero: Bei der Kommentarfunktion stimmt der Hinweis „*Codebeispiele können im PRE-Tag angegeben werden.“ nicht, wenn man das führende PHP-Tag angibt. Siehe meinen Kommentar zuvor.

  15. gjerokrsteski sagte am 3. April 2012 um 17:52 Uhr:

    @Daniel: Huh, das habe ich übersehen. Danke dir! Das sollte nun mit ein CODE Tag gehen.

Hinterlasse einen Kommentar

*Codebeispiele können im CODE-Tag angegeben werden.

Powered by Wordpress • Abonniere den RSS Feed