EDIT:
fragen und diskussionen zu dem sticky können HIER geklärt werden.
technische fragen zur umstellung auf PHP5, welche nicht in diesem sticky behandelt werden, können durch das erstellen einen neuen threads, hier im php-forum, geklärt werden. bitte wählt beim erstellen des threads PHP5 beim dropdown im betreff aus.
und nun viel spass mit pekka ausführungen......
by Abraxax (extended edit by TobiaZ)
Mein Provider stellt auf PHP 5 um! Wird meine Site danach weiterlaufen? Was muß ich beachten?
Als Allererstes: Keine Panik. Die Entwickler waren sich der Tatsache bewußt, daß die eine oder andere Site mit PHP betrieben wird und sind entsprechend Maßvoll mit gravierenden Änderungen umgegangen. Für die meisten Skripte dürften sich keine oder nur minimale Umstellungen ergeben.
Es gibt jedoch einige syntaktische Änderungen, derer man sich bewußt sein sollte.
Die "Ruhig schlafen"-Workarounds sind Vorschläge und vor allem für die armen Admins gedacht, die dafür sorgen müssen, daß irgendwelche 30.000-Zeilen-Monster, die von einem inzwischen nicht mehr erreichbaren Programmierer (Auf die Malediven ausgewandert; Im Knast; Auf der Strasse) erstellt wurden, weiterlaufen. Die meisten dieser Vorschläge sind keine Beispiele für sauberen Programmierstil. Es versteht sich von selbst, daß man solche Änderungen nicht in einer live-Umgebung durchführt und daß man davor Backups der Quelltexte zieht. Optimal sind natürlich umfangreiche Tests in einer nicht öffentlichen PHP-5-Umgebung.
strrpos() and strripos() now use the entire string as a needle.
Mögliche Probleme: Fehlfunktionen könnte dies in altem Code verursachen, wenn aus Bequemlichkeit eine längere Zeichenkette als needle übergeben wurde (z.B. ":xyz", obwohl nur ":" relevant war).
Ruhig schlafen: Skripte nach der Verwendung von strrpos() durchsuchen und prüfen, ob irgendwo als needle Variablen unklaren Inhalts durchrutschen könnten, die jetzt in PHP 5 in ihrer Gänze interpretiert werden. Sollten sich solche Konstellationen finden, beschneidet man die needle-Variable, beispielsweise mit substr($needle, 0,1).
Illegal use of string offsets causes E_ERROR instead of E_WARNING.
array_merge() was changed to accept only arrays. If a non-array variable is passed, a E_WARNING will be thrown for every such parameter. Be careful because your code may start emitting E_WARNING out of the blue.
Mögliche Probleme: Unerwünschte Warnmeldungen. Können header()-Ausgaben stören und sehen im Live-Betrieb ziemlich scheisse aus.
Ruhig schlafen: Skripte nach Verwendung von array_merge() durchsuchen, alle dort übergebenen Parameter mit is_array() auf ihren Datentyp hin untersuchen und nur echte Arrays als Parameter für array_merge() weitergeben.
The T_ML_CONSTANT constant is no longer defined by the Tokenizer extension. If error_reporting is set to E_ALL, PHP will generate a notice. Although the T_ML_CONSTANT was never used at all, it was defined in PHP 4. In both PHP 4 and PHP 5 // and /* */ are resolved as the T_COMMENT constant. However the PHPDoc style comments /** */ ,which starting PHP 5 are parsed by PHP, are recognized as T_DOC_COMMENT.
$_SERVER should be populated with argc and argv if variables_order includes "S". If you have specifically configured your system to not create $_SERVER, then of course it shouldn't be there. The change was to always make argc and argv available in the CLI version regardless of the variables_order setting. As in, the CLI version will now always populate the global $argc and $argv variables.
Mögliche Probleme: In Skripten, in denen die Globalen $argc und $argv in einem anderen Kontext als dem Auslesen von Kommandozeilenoptionen verwendet wurden, könnte zu Kollisionen kommen.
Ruhig schlafen: Skripte nach Variablenzuweisungen an $argc und $argv durchsuchen. Variablen in etwas unverfänglicheres umbenennen.
An object with no properties is no longer considered "empty".
PHP-Code:
class objekt_ohne_alles {}
$obj_objekt_ohne_alles = new objekt_ohne_alles();
PHP-Code:
if ($obj_objekt_ohne_alles)
Mögliche Probleme: [COLOR=orangered]Mir fallen keine denkbaren Situationen ein, bei denen man gegen ein leeres Objekt vergleichen müsste, wenn man bei der Erstellung nicht total high war. Euch?[/COLOR]
Ruhig schlafen: Siehe oben.
In some cases classes must be declared before used. It only happens only if some of the new features of PHP 5 are used. Otherwise the behaviour is the old.
get_class() starting PHP 5 returns the name of the class as it was declared which may lead to problems in older scripts that rely on the previous behaviour (the class name was lowercased). A possible solution is to search for get_class() in all your scripts and use strtolower().
Mögliche Probleme: In Skripten, die die Ergebnisse von get_class()-Aufrufen mit im Code definierten Strings vergleichen, können die Vergleiche andere Ergebnisse liefern als bisher.
Ruhig schlafen: Wie die offizielle Empfehlung schon sagt: Skripte nach get_class()-Aufrufen durchsuchen und durch strtolower(get_class()) ersetzen.
ip2long() now returns FALSE when an invalid IP address is passed as argument to the function, and no longer -1.
Mögliche Probleme: Das Abfangen von ungültigen IP-Adressen wird gestört, weil dies mit der bisher gültigen Methode (if ip2long() == -1) nicht mehr funktioniert. Mit unkalkulierbaren Folgen, weil ungültige Angaben durch die Prüfung rutschen und die weitere Verarbeitung beeinflussen könnten.
Ruhig schlafen: Skripte nach eventuellen ip2long()-Aufrufen durchsuchen. Die Zeilen hinter gefundenen Aufrufen nach Abfangmechanismen mit Überprüfung auf -1 ($ergebnis = ip2long($variable); if ($ergebis == -1).....) durchsuchen und -1 durch false ersetzen.
Neue reservierte Begriffe
Mit den neuen Objektfunktionen von PHP 5 halten auch neue reservierte Begriffe Einzug. Klassen- und Funktionsnamen dürfen dann nicht mehr identisch mit diesen Begriffen sein.
Mögliche Probleme: Syntaxfehler und Abbrüche in Skripten, die Klassen oder Funktionen enthalten, deren Namen mit diesen Begriffen identisch sind.
Ruhig schlafen: Skripte nach solchen Klassen- und Funktionsnamen durchsuchen. Entsprechende Kandidaten umbenennen, etwa die Klasse "abstract" in "class_abstract". Diese Umbenennung muß natürlich in allen folgenden Instanzierungen und Aufrufen ebenfalls erfolgen.
Die neuen reservierten Begriffe:
public
protected
private
final
interface
implements
abstract
Kommentar