[PHP] Heredoc-Syntax bei Array-Initialisierung

theHacker

sieht vor lauter Ads den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.682
1.316
Moin.

Is mir heute begegnet (PHP 5.2.5):
PHP:
<?php
$foo = array('index' => <<<FAILS
bar
FAILS;
);
echo $foo['index'];
?>
liefert
PHP Parse error: syntax error, unexpected ';', expecting ')' in ...foo.php on line 4
, hingegen
PHP:
<?php
$var = <<<SUCCESS
bar
SUCCESS;
$foo = array('index' => $var);
echo $foo['index'];
?>
läuft problemlos durch.

Im Manual hab ich nix gefunden, außer, dass
It is very important to note that the line with the closing identifier must contain no other characters, except possibly a semicolon (;). That means especially that the identifier may not be indented, and there may not be any spaces or tabs before or after the semicolon. It's also important to realize that the first character before the closing identifier must be a newline as defined by the local operating system. This is \n on UNIX systems, including Mac OS X. The closing delimiter (possibly followed by a semicolon) must also be followed by a newline.
Quelle: https://de2.php.net/manual/de/language.types.string.php#language.types.string.syntax.heredoc

Auch mit Newline vor dem gesamten Heredoc-Ausdruck
PHP:
<?php
$foo = array('index' =>
<<<FAILS
bar
FAILS;
);
echo $foo['index'];
?>
funktioniert es nicht.

Ist das ein Bug in PHP? Darf man das einfach nicht machen und es ist nur nicht dokumentiert? Oder liegts vielleicht an meiner Version - bin nicht 100%ig auf dem aktuellen Stand -?
 
Ich habs mal bei mir getestet (4.4.0 und 5.2.6), wenn Du das Semikolon beim End-FAILS weglässt, dann funktionierts. Ich nehme mal an, dass das net wirklich ein Bug ist, zumal das ja auch net so schön aussieht *lach* :D.

*edit*
Oh Nein! Is doch was im Busch :p, man kann keine weiteren Werte anfügen, weil dann kommt der nächste Error.

PHP:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
 
Zuletzt bearbeitet:
Ich würde mal sagen, das ist "expected behaviour".
Also bei Heredoc wundert mich nix mehr, die Syntax ist eh zum grauen.

Der Tokenizer in PHP erkennt das Ende eines Kommandos bei einem Semikolon und macht, wie man sieht, da keine Ausnahmen, dementsprechend kann der Tokenizer wohl nicht erkennen, dass das Semikolon zum Heredoc-Ausdruck und nicht zum Array gehört (Beispiel 1 - siehe auch die Fehlermeldung).
Es wurde wahrscheinlich nie eingeplant Heredoc-Ausdrücke als "Unter-Ausdrücke" zu verwenden.
 
Ich habs rausgefunden:
PHP:
<?php
error_reporting(E_ALL);
$bla = array(
    'c' => <<<FOOBAR
barbarbarbara
FOOBAR
    ,'d' => 'blub',
);

print_r($bla);

?>

Die Syntax ist wirklich doof, da man das Komma nicht in die selbe Zeile wie die Endung des Heredocs schreiben darf :roll:

(sorry das ich den alten Thread hier so hochhole, aber gibt sicher einige, die nach dieser Lösung suchen und dieser Thread ist leicht zu finden)
 
Alles quatsch, ihr noobs :)

(ja, ja, alter Thread, ich weiss, who cares)

:roll: Leute, seid ihr denn alle blind ?

Die Fehlermeldung von theHacker sagte doch alles aus:
"PHP Parse error: syntax error, unexpected ';', expecting ')' in ...foo.php on line 4 "

Das ist kein php-bug, sondern doch einfach nur ein Semikolon zu viel:
$var = array ( key => value ); // hier darf nach php-syntax genau ein Semikolon vorkommen, am Ende !

Daher darf nach dem heredoc-tag kein Semikolon stehen.
Erst muss doch das Array geschlossen werden und dann kommt das EINZIGE erlaubte Semikolon.

Wenn bei einer einfache Variablen-Zuordnung nur noch ein Semikolon kommen muss, kann man dieses Semikolon auch direkt hinter dem heredoc-tag in die gleiche Zeile packen.
Die php-Anweisung ist dann mit diesem Semikolon komplett.

Andere Zeichen, z.B. eine schliessende Array-Klammer, dürfen nicht hinter dem heredoc-tag in dessen Zeile stehen.
Das heredoc-tag muss dann allein in einer Zeile stehe und in der folgenden Zeile dann die anderen Zeichen, in diesem Beispiel );

Das Semikolon, welches man hinter dem heredoc-tag schreiben kann, gehört eben NICHT zum heredoc-tag, wie ihr wahrscheinlich alle so verstanden habt, sondern zur normalen Syntax der gesamten php-Anweisung.

Das ist doch nicht so schwer zu begreifen.
theHacker hatte doch auch die php-docu zitiert.
Dort steht alles gut erklärt.
Einfach mal lesen.

Mfg,
Andi