jetzt fehlt nur noch der text von pekka ... ;-)
Frage zu PHP 5 OOP [F/V z F]
Einklappen
X
-
INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
-
Original geschrieben von TobiaZ
(außer bei dir, du scheinst ja gewaltig langeweile zu haben )INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
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
-
Teil 2 wegen 10.000-Zeichen-Grenze
Mögliche (neue) serverseitige Problemquellen
mail.force_extra_parameters in der php.ini
Außerhalb des PHP Safe mode besteht beim mail()-Befehl die Möglichkeit, in einem fünften Parameter weitere Angaben direkt an das sendende Mail-Programm zu übergeben. Bei sendmail hilft beispielsweise ein "-f{email}" manchmal, Spam-Filter auf Empfängerseite zu umgehen. Seit PHP 5 gibt es nun in der php.ini die Möglichkeit, bei *jedem* Mail-Aufruf einen fünften Parameter zu erzwingen. Im Skript angegebene fünfte Parameter werden hierbei überschrieben und ignoriert.
Mögliche Probleme: Bei Providern, die von dieser Einstellungsmöglichkeit aus welchen Gründen auch immer Gebrauch machen, könnten im Skript angegebene "fünfte Parameter" nicht mehr funktionieren.
Ruhig schlafen: Bei Provider rückfragen, ob dieser Parameter verwendet wird bzw. via phpinfo() selber nachschauen. Falls ja: Skript nach mail()-Aufrufen und Parameter zählen. Falls der Fünfte verwendet wird, individuelles Workaround entwickeln.
register_long_arrays in der php.ini
Seit PHP 5 ist es möglich, die Befüllung der nach dem alten Muster aufgebauten Umgebungsvariablen $HTTP_*_VARS komplett abzuschalten.
Mögliche Probleme: Sollte der Provider register_long_arrays auf "Off" schalten, funktionieren altmodische Variablenangaben wie $HTTP_POST_VARS statt $_POST endgültig nicht mehr.
Ruhig schlafen: Skripte nach der Verwendung dieser Variablen durchsuchen. Durch jeweilige neue Notation ersetzen. Dies lohnt sich in jedem Fall, auch wenn der Provider die Verwendung dieser Variablen weiterhin ermöglicht.
Neues Errorlevel E_STRICT
Bei PHP 5 kommt ein neues Error-Reporting-Level hinzu: E_STRICT. E_STRICT ist dafür ausgelegt, Code auf seine Zukunftssicherheit zu überprüfen: So wird beispielsweise eine Meldung ausgegeben, wenn als veraltet deklarierte Notationen oder Funktionen verwendet werden. Ergo: In einer Produktionsumgebung hat E_STRICT nichts zu suchen; Es sei aber hier auf seine Existenz hingewiesen für den Fall, dass man einen übereifrigen IT-Administrator hat, der das einfach mal reingemacht hat - mit dem Ergebnis, daß man jetzt bei jedem 2. Skript mit mysteriösen Fehlermeldungen zu kämpfen hat.
-------------------------------------------------------------------------------
Dieser Text ist im Grunde eine erweiterte und kommentierte Version der offiziellen Übersicht (http://www.php.net/manual/de/migration5.php), von der auch die Zitate stammen .
Wie in Diskussionsforen üblich, sind diese Hinweise nach bestem Wissen und Gewissen "as is" zusammengestellt. Es besteht kein Anspruch auf Vollständigkeit und Richtigkeit; Keine Haftung für aus der Umsetzung dieser Hinweise resultierende Probleme.
Darüberhinaus ist Pekka nicht ab jetzt offizielle Anlaufstelle der PHP-Resource für alle Migrationsthemen
Zuletzt geändert von pekka; 04.08.2004, 23:31.
Kommentar
-
@pekka
so. dein sticky ist nun hier im PHP zu finden.
ich habe das bewusst nur als copy gemacht, damit der text hier noch ist.
wenn am sticky was ändern willst, mache es. notfalls schreibe bitte einem MOD eine PM , um das close zu öffnen.
nur will ich nciht, dass jeder hinz und kunz dort reinschreiben kann .. ;-)INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
lies mal deine PM.. ;-)INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
ok. Ich fuhrwerke in der Version hier rum, bis sie passt, und bitte dann einen der Mods um Öffnen des Sticky, wenns komplett fertig ist.
@alle: Bitte die Version in diesem Thread als Diskussionsgrundlage nutzen und noch nicht das Sticky selbst. Hier steht die aktuellste Version drin.
EDIT:
Ah upps. PMs guck ich nieZuletzt geändert von pekka; 04.08.2004, 23:32.
Kommentar
-
Vielleicht könnt ihr das auch noch gebrauchen. Werd es auch noch überabreiten. Gruß GriZZ
Exception:
PHP-Code:class Exception {
//...
}
Die Klasse "Exception" ist eine von PHP5 vordefinierte Klasse für die neue Fehlerbehandlung.
[HR]
Methoden:
PHP-Code:class MyPHP5 {
function __construct(){;}
function __destruct(){;}
function __set(){;}
function __get(){;}
function __call(){;}
function __toString(){;}
}
überprüfen. Die Methodennamen sind für spezielle Funktionen gedacht.
__construct() ist der neue Konstruktor, der beim Erzeugen einer Instanz automatisch aufegrufen wird.
Die alte Variante funktioniert noch (Konstruktor hat den selben Namen der Klasse function MyPHP5(){;} ), und
wird aufgerufen wenn __construct() nicht vorhanden ist. Wenn man für beide Versionen eine Klasse schriebt hilft
folgendes::
PHP-Code:class MyPHP5 {
function __construct( $params ){
// Eigentliche Konstruktor Funktion
}
function MyPHP5( $params ){
MyPHP5::__construct( $params );
}
}
Am Ende des Skripts oder wenn man eine Objektreferenzen aus dem Speicher entfernt ( unset($obj); ), wird
das Objekt zum löschen makiert, die interne Speicherbereinigung von PHP wird dann "irgendwann" (nicht festgelegt)
das Objekt entfernen und den Destruktor auslösen.
__set(), __get(), sind Methoden, die das überladen eine Klasse "ermöglichen". Wenn eine
Instanzvariabel nicht existiert, wird die Methode __set() automatisch aufgerufen um die Variable zu setzen.
Methoden sich wie Instanzvariablen verhalten.
$obj->variable_gibt_es nicht = 10; würde nun __set( $var, $value ) aufrufen.
echo $obj->variable_gibt_es nicht; würde nun __get( $var ) aufrufen.
PHP-Code:class MyPHP5 {
function __set($var, $value){
$this->$var = $value;
}
function __get($var){
if (empty($this->$var)){
$this->$var = 200;
}
return $this->$var;
}
}
$obj = new MyPHP5 ;
echo $obj->variabel_existier_nicht . "\n";
$obj->variabel_existier_nicht = 10;
echo $obj->variabel_existier_nicht . "\n";
PHP-Code:class MyPHP5 {
function __call(){
echo 'Die aufgerufene Methode existiert nicht !';
}
}
$obj = new MyPHP5 ;
$obj->methode_existiert_nicht();
wenn man ein Objekt versucht auszugeben (z.B. echo $obj; )
PHP-Code:class MyPHP5 {
var $name = 'Mein Name';
function __toString(){
return 'Sie befinden sich in der Klasse: ' . __CLASS__ . ' und $name hat den Inhalt: "' . $this->name . "\"\n";
}
}
$obj = new MyPHP5;
echo '<pre>' . print_r($obj) . '</pre>'; // Zeigt den internen Objektaufbau
echo $obj; // zeigt die Ausgabe aus __toString Methode ... an ohne __toString die Objektidentifikationsnummer
Kommentar
-
"clone" ist auch noch ein reserviertes Keyword.
Zum Beitrag von GrizZ passt vielleicht noch:
http://de.php.net/oop5.cloning
Kommentar
-
Nun, nette Übersicht
Allerdings steht z.B. in der aktuellen Version der Inkompitabeln Änderungen ein Beispiel wie man einen "illegal use of string offsets" erzeugt.
PHP-Code:$str = 'abc';
unset($str[0]);
[COLOR=red]Fatal error: Cannot unset string offsets in ...[/COLOR]
Ist übrigends der dort vorgegebene Code mit PHP5 getestet..
Auf Ruhig Schlafen muss man wohl nicht eingehen, war ja auch schon in PHP4 falscher Code
Außerdem verweise ich auf die Kommentare dort (falls du sie dir noch nicht durchgelesen hast), welche auf dort nicht aufgelistete Änderungen hinweisen...
Floriam
Kommentar
Kommentar