Nicht abwärtskompatible Änderungen

Obwohl der meiste PHP 5 basierende Code ohne Änderungen funktionieren sollte, gibt es einige nicht abwärtskompatible Änderungen:

  • Safe mode wird nicht länger unterstützt. Alle Anwendungen, die sich auf safe mode verlassen, benötigen unter Umständen Anpassungen bezüglich der Sicherheit.
  • Magic quotes wurde entfernt. Anwendungen, die sich auf dieses Feature verlassen, müssen aktualisiert werden, um Sicherheitsprobleme zu vermeiden. get_magic_quotes_gpc() und get_magic_quotes_runtime() geben nun immer FALSE zurück. set_magic_quotes_runtime() erzeugt eine Fehler der Stufe E_CORE_ERROR, wenn versucht wird Magic quotes zu aktivieren.
  • Die register_globals und register_long_arrays php.ini Direktiven wurden entfernt.
  • Die mbstring.script_encoding Direktive wurde entfernt. Statt dessen ist zend.script_encoding zu verwenden.
  • Referenzübergabe zur Laufzeit wurde entfernt.
  • Die break und continue Anweisungen akzeptieren keine variablen Argumente mehr, d.h. es ist nicht möglich break 1 + foo() * $bar; zu schreiben. Statische Argumente wie break 2; funktionieren weiterhin. Als Nebeneffekt dieser Änderung sind break 0; und continue 0; nicht länger erlaubt.
  • Der Standardzeichensatz für htmlspecialchars(), htmlentities() und html_entity_decode() ist nun UTF-8 anstatt ISO-8859-1. Es ist zu beachten, dass die Änderung des Ausgabezeichensatzes durch die default_charset Konfigurationseinstellung htmlspecialchars/htmlentities nicht betrifft, es sei denn, dass "" (eine leere Zeichenkette) als encoding Parameter an die htmlspecialchars()/htmlentities()>/html_entity_decode() Aufrufe übergeben wird. Allgemein wird dies jedoch nicht empfohlen, weil es möglich sein sollte, den Ausgabezeichensatz zu ändern, ohne dass der Laufzeitzeichensatz, der von diesen Funktionen verwendet wird, betroffen ist. Die sicherste Lösung ist den Zeichensatz explizit bei jedem Aufruf von htmlspecialchars(), htmlentities() und html_entity_decode() anzugeben.
  • Das Setzen der Zeitzone mit der TZ Umgebungsvariablen wird nicht länger von der Datum und Uhrzeit Extension unterstützt. Statt dessen muss eine Zeitzone unter Verwendung der date.timezone php.ini Option oder der date_default_timezone_set() Funktion angegeben werden. PHP wird nicht länger versuchen die Zeitzone zu erraten, sondern wird statt dessen auf "UTC" zurückfallen und eine E_WARNING erzeugen.
  • Nichtnumerische Zeichenkettenoffsets, z.B. $a['foo'], wobei $a eine Zeichenkette ist, geben nun false für isset() und true für empty() zurück, und erzeugen ein E_WARNING, wenn versucht wird, sie zu verwenden. Offsets der Typen double, bool und null erzeugen ein E_NOTICE. Numerische Zeichenketten (z.B. $a['2']) funktionieren wie bisher. Es ist zu beachten, dass Offsets wie '12.3' und '5 irgendwas' als nichtnumerisch angesehen werden, und ein E_WARNING erzeugen, aber aus Gründen der Abwärtskompatibilität zu 12 bzw. 5 konvertiert werden. Hinweis: der folgende Code gibt unterschiedliche Ergebnisse zurück. $str='abc';var_dump(isset($str['x'])); // false unter PHP 5.4 oder später, aber true unter 5.3 oder weniger
  • Konvertieren von Arrays zu String wird nun einen Fehler der Stufe E_NOTICE verursachen, aber das Ergebnis der Umwandlung ist weiterhin die Zeichenkette "Array".
  • NULL, FALSE oder leere Zeichenketten durch Hinzufügen einer Eigenschaft in ein Objekt zu konvertieren wird nun einen Fehler der Stufe E_WARNING statt E_STRICT ausgeben.
  • Parameternamen, die Superglobale schattieren, verursachen nun einen fatalen Fehler. Das verbietet Code wie function foo($_GET, $_POST) {}.
  • Die Salsa10 und Salsa20 Hash-Algorithmen wurden entfernt.
  • Der Tiger Hash-Algorithmus verwendet nun Big-Endian-Byte-Reihenfolge. Wie Code geschrieben werden kann, der sowohl mit PHP 5.3 als auch 5.4 kompatibel ist, kann diesem Beispiel entnommen werden.
  • array_combine() gibt nun array() anstatt FALSE zurück, wenn zwei leere Arrays als Parameter übergeben wurden.
  • Wird htmlentities() mit asiatischen Zeichensätzen verwendet, funktioniert es wie htmlspecialchars() - das war auch in früheren PHP Versionen so, aber nun wird ein Fehler der Stufe E_STRICT ausgegeben.
  • Der dritte Parameter von ob_start() wurde von boolean erase in integer flags geändert. Es ist zu beachten, dass Code der erase ausdrücklich auf FALSE setzt, sich unter PHP 5.4 nicht länger wie erwartet verhält; dieses Beispiel zeigt wie Code geschrieben wird, der kompatibel zu PHP 5.3 und PHP 5.4 ist.

Die folgenden Schlüsselwörter sind nun reserviert, und dürfen nicht als Namen von Funktionen, Klassen usw. genutzt werden.

Folgende Funktionen wurden von PHP entfernt:

add a note add a note

User Contributed Notes 3 notes

up
40
ky dot patterson at adlinkr dot com
10 years ago
If you have content that is not 100% UTF-8 then TAKE NOTE:

Starting in PHP 5.4 htmlspecialchars() and htmlentities() assume charset=UTF-8 by default AND WILL RETURN BLANK IF YOUR INPUT IS NOT VALID UTF-8.

So if you have a lot of function calls that look like this:
<?php
echo htmlspecialchars($input);
// or
echo htmlentities($input);
?>
i.e. no charset and no flags -- and $input is ISO-8859 (or anything else apart from 7-bit ASCII or UTF-8) -- then PHP 5.4 and 5.5 will return an empty string, and you will be surprised and probably unhappy.

This is apparently a feature, not a bug.
up
30
Chris
11 years ago
Missing some chars like german umlauts after use of htmlspecialchars? That's because the third param encoding has changed it's default value in PHP 5.4 from ISO-8859-1 to UTF-8.

Possible solution #1:
Change your code from this ...
<?php htmlspecialchars( 'äöü' ); ?>
... to this:
<?php htmlspecialchars ( 'äöü' , ENT_COMPAT | ENT_HTML401 , 'ISO-8859-1' ); ?>

Possible solution #2:
Create a wrapper function and replace htmlspecialchars( to i.e. isohtmlspecialchars( with your IDE/editor/shell...

Example of a wrapper function:
<?php
function isohtmlspecialchars( $str ){
   return
htmlspecialchars ( $str , ENT_COMPAT | ENT_HTML401 , 'ISO-8859-1' );
}
?>
up
20
anton at zebooka dot com
11 years ago
It seems that starting of PHP 5.4 you can not override class method with different signature.

Example:
<?php
class A
{
    public function
doSomething($a, $b)
    {
    }
}

class
B extends A
{
    public function
doSomething($c)
    {
    }
}
?>

PHP Strict standards:  Declaration of B::doSomething() should be compatible with A::doSomething(B $a) in Command line code on line 1
To Top