PHP Scripte PHP4/PHP5 portabler machen

QuHno

Außer Betrieb
Ich musste mich letztens mit einer alten PHP4.0.6 Version herumschlagen und habe zu meinem Entsetzen feststellen müssen, dass diverse Superglobale Variablen wie z.B. $_GET oder $_SERVER nicht zur Verfügung standen.

Ein Blick ins PHP Manual offenbarte jedoch, dass in älteren Versionen vergleichbare Konstrukte mit ähnlichen Eigenschaften existieren, sie heißen bloß anders.

Lösung:
Falls die benötigten Variablen nicht vorhanden sind, referenziert man sie auf die älteren, ein "Trick" wie er des öfteren in C benutzt wird (Stichworte: Pointer, Handle ;)), der aber in PHP genau so gut funktioniert.

So geht's:
PHP:
<?php
    if (!isset($_SERVER)){$_SERVER = &$HTTP_SERVER_VARS;}
    if (!isset($_GET)){$_GET = &$HTTP_GET_VARS;}
    if (!isset($_POST)){$_POST = &$HTTP_POST_VARS;}
    if (!isset($_ENV)){$_ENV = &$HTTP_ENV_VARS;}
    if (!isset($_COOKIE)){$_COOKIE = &$HTTP_COOKIE_VARS;}
    if (!isset($_FILES)){$_FILES = &$HTTP_POST_FILES;}
    if (!isset($_SESSION)){$_SESSION = &$HTTP_SESSION_VARS;}
    if (!isset($_REQUEST)){$_REQUEST = array_merge($_GET, $_POST, $_COOKIE);}
?>
Man beachte die kleinen & vor den Variablen, die erledigen den Trick :D

Dies kann vor allen anderen Funktionsaufrufen oder Befehlen - außer session_start(); - eingesetzt werden und "mappt" die Variablen bei Bedarf um. Die meisten Scripte sollten danach problemlos ohne Änderungen sowohl unter PHP4 als auch PHP5 laufen.

Leider habe ich noch keine Möglichkeit gefunden, wie ich $_REQUEST auch superglobal machen kann, also bitte immer nur in einem Script benutzen oder entsprechend übergeben.


edit:
Es geht in den meisten Fällen auch kürzer, aber das kann bei Versionen kleiner als PHP 4.0.6 schief gehen:

PHP:
<?php 
if (!isset($_SERVER)){
    $_SERVER = &$HTTP_SERVER_VARS; 
    $_GET = &$HTTP_GET_VARS;
    $_POST = &$HTTP_POST_VARS;
    $_ENV = &$HTTP_ENV_VARS;
    $_COOKIE = &$HTTP_COOKIE_VARS;
    $_REQUEST = array_merge($_GET, $_POST, $_COOKIE);
}
if (!isset($_FILES)){$_FILES = &$HTTP_POST_FILES;} 
if (!isset($_SESSION)){$_SESSION = &$HTTP_SESSION_VARS;} 
?>
 
Zuletzt bearbeitet:
Oben