Benjamin Wilfing: Globale dynamische Variablen

Hallo,

ich stehe mal wieder vor einem Problem: Ich schreibe eine Funktion, die eine Überschrift und einen Text zu einem beliebigen HTTP-Fehler ausgibt.
In einer externen Configdatei, die includet wird, gibt es für jeden HTTP-Errorcode 2 Variablen, die vom Namen her gleich aufgebaut sind:

$http_[code]_title = "";  // Überschrift für Meldung
  $http_[code]_msg = "";    // Text der Meldung

Diese will ich dann über die Funktion sendHttpErrorMsg($errno) ausgeben lassen. Damit ich keine switch-Anweisung wegen der vielen möglichen HTTP-Errorcodes basteln muß, löse ich das Problem über dynamische Variablen (Funktion vereinfacht dargestellt).

function sendHttpErrorMsg($errno) {
    echo "<h1>".${"http_".$errno."_title"}."</h1>";
    echo "<p>".${"http_".$errno."_msg"}."</p>";
  }

Da ich hier nun die Variablen aus der Configdatei innerhalb einer Funktion benutze, muß ich sie "globalisieren". Da müßte ich aber nun wieder alle HTTP-Codes einzeln global verfügbar machen. Daher dachte ich an so etwas wie

function sendHttpErrorMsg($errno) {
    global ${"http_".$errno."_title"};
    global ${"http_".$errno."_msg"};
  ...
  }

, damit die Funktion für jede Zahl verwendbar ist. Das funktioniert aber leider nicht, da bekomme ich einen Parse Error:

Parse error: parse error, expecting STRING' or '$'' in functions.inc on line 56

Sobald ich aber die Variablen direkt bennene (z.B. global $http_401_title;), funktioniert es.

Was mache ich in der global-Anweisung falsch ? Darf man keine dynamischen Variablen globalisieren ?

Danke und

Viele Grüße aus Darmstadt,
Benjamin

  1. Hi,

    $http_[code]_title = "";  // Überschrift für Meldung
      $http_[code]_msg = "";    // Text der Meldung

    humpf. Was hälst Du von $http_title[$code], also z.B. $http_title[404]? Mit einem Array hättest Du Dir dieses und andere Probleme gespart.

    Oder $http[$code]['title'], wenn Du konsequent sein willst ;-)

    Cheatah

    1. Hallo,

      Oder $http[$code]['title'], wenn Du konsequent sein willst ;-)

      stimmt, das ist die wohl beste Lösung. Darauf wäre ich im Leben nicht gekommen...

      muchas gracias :-)

      Grüße aus Darmstadt,
      Benjamin

  2. function sendHttpErrorMsg($errno) {
        global ${"http_".$errno."_title"};
        global ${"http_".$errno."_msg"};
      ...
      }

    , damit die Funktion für jede Zahl verwendbar ist. Das funktioniert aber leider nicht, da bekomme ich einen Parse Error:

    Parse error: parse error, expecting STRING' or '$'' in functions.inc on line 56

    Würde sagen, das ist eine Aufgabe für eval().
    Versuch mal sowas wie

    eval ('global ${"http_' . $errno . '_title");');

    1. Hi,

      Würde sagen, das ist eine Aufgabe für eval().

      würde sagen, eval() sollte vermieden werden, solange das mit überschaubarem Aufwand (unter einem Manntag) machbar ist. eval() is evil().

      Cheatah