Rolf B: Aufruf einer CSS-Datei funktioniert nicht

Beitrag lesen

Hallo Eric,

Link zum Handbuch: String-Interpolation in PHP

Konkreter Fehler: Du verwendest die einfache Syntax (oder basic syntax). Die unterstützt zwar Arrayzugriffe mit String-Keys, aber da diese Syntax uralt ist, basiert sie auf uralter Array-Notation ohne Hochkommas:

Falsch:

... href="/CSSLib/$_SERVER['Lay_e'].css"

Richtig:

... href="/CSSLib/$_SERVER[Lay_e].css"

In den eckigen Klammern darf stehen:

  • Ein Name
  • Eine Variable (also "foo{$arr[$i]}" ist ok)
  • Eine Zahl

Ein Name muss dem Muster [a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]* entsprechen, erlaubt sind im Namen also ASCII-Buchstaben, ASCII-Ziffern (außer am Anfang), ein Unterstrich und die Zeichen mit dem Code 0x80 bis 0xff. Falls Du PHP-Code in UTF-8 speicherst, sollten auch alle Unicode-Zeichen erlaubt sein, weil die in UTF8 als 2 oder mehr Bytes mit Codes von 0x80 bis 0xFF codiert werden.

Alternativ kannst Du auch die erweiterte Interpolationssyntax mit geschweiften Klammern wählen, dann MUSS ein Array-Key in Anführungszeichen stehen:

Auch richtig:

... href="/CSSLib/{$_SERVER['Lay_e']}.css"

Hinweis dazu, warum href="CSSLib/" . $_SERVER['Lay_e'] . ". CSS"> nicht funktioniert: Wenn Du Dich in einem Heredoc-String befindest (also diese <<< Notation), kannst Du nicht eben mal mit dem Punkt-Operator Strings verketten. Der Heredoc-String ist ja nicht beendet, er nimmt den Punkt deshalb als String-Inhalt. Was Du hättest machen können: $_SERVER['Lay_e'] in einer normalen Variablen speichern und diese dann mit normaler String-Interpolation einsetzen.

$language = $_SERVER['Lay_e'];
echo <<<END
<link rel="stylesheet" href="/CSSLib/$language.css">
END;

Die Diskussion darüber, HTML-Code mit ECHO auszugeben, ist mir zwar eigentlich leid, aber ich persönlich finde es ganz schlecht. Moderner Code sieht aus meiner Sicht eher so aus:

function renderPage() {
   $foo = 1;    // Irgendwelche Initialisierungen
   $bar = 2;
?>
<!doctype html>
<html lang="de">
<head>
   <title>Demo</title>
   ...weitere nötige head-Einträge...
   <link rel="stylesheet" href="/CSSLib/<?= $_SERVER['Lay_e'] ?>">
   <link rel="stylesheet" href="/CSSLib/<?= $_SERVER['Hai_o'] ?>">
   <link rel="stylesheet" href="/CSSLib/<?= $_SERVER['Hui_Buh'] ?>">
   ...und so weiter...
</head>
<body>
<?php renderBody() ?>
</body>
</html>
<?php
}   // Ende von render()

Ob man das in Funktionen packt und die Body-Ausgabe in eine weitere Funktion auslagert, ist Geschmackssache und hängt auch von der Komplexität der Seite ab.

Rolf

--
sumpsi - posui - obstruxi