Kategorie PHP

PHP 7.2.0 Beta 1 veröffentlicht

Lesezeit ca. 6 Min.

Vor einigen Tagen wurde PHP 7.2.0 Beta 1 veröffentlicht. Aus diesem Anlaß sehen wir uns einmal an, welche Funktionalitäten als überholt (Original: deprecated) eingestuft werden und mit der Version 8.0 herausfallen werden.

Die folgenden Funktionalitäten sind für eine Einstufung als “deprecated” ausgewählt worden und nach der bisherigen Abstimmung im Gremium scheinen alle bis auf each() große Chancen zu haben, tatsächlich als überholt eingestuft zu werden. Bei each() scheint es noch Diskussionsbedarf vor einer endgültigen Entscheidung zu geben.

__autoload

Die magische Funktion __autoload wurde in PHP 5.1 durch spl_register_autoload überholt und die weitere Verwendung wird in der Dokumentation nicht empfohlen. Ein Vorteil von spl_register_autoload ist die Fähigkeit, mehrere verkettete Autoloader zu ermöglichen und damit die Library Kompatibilität zu erleichtern. Beide Mechanismen können nicht zusammenarbeiten. Der Einsatz von __autoload() schließt daher den Einsatz von spl_register_autoload() aus. Da letztere Funktion weitaus häufiger verwendet wird, ist der Einsatz von __autoload mittlerweile sehr gering. Es wird daher empfohlen, eine “Deprecation” Meldung auszuwerfen, wenn der Compiler auf eine Funktion __autoload() trifft.

$php_errormsg

Die $php_errormsg Variable wird im lokalen Geltungsbereich erzeugt, wenn ein “non-fatal error” ausgelöst wird, sofern die Einstellung “track_errors” in der ini.php aktiviert ist (standardmäßig deaktiviert) und der Fehler nicht von einem Error Handler bereits verarbeitet wurde.

Abgesehen davon, dass die Variable von den Einstellungen in der ini.php abhängig ist, und ihr Verhalten schwer durchschaubar ist, liefert die Funktion error_get_last einen besseren Weg, um den zuletzt erzeugten Fehler zu erhalten. Seit PHP 7 gibt es noch zusätzlich die Funktion error_clear_last, womit die Verwendung der Variablen $php_errormsg endgültig überflüssig geworden ist.

Bei Aktivierung der INI-Einstellung “track-errors” wird künftig eine “deprecated” Meldung angezeigt, wenn die Variable $php_errormsg verwendet wird.

create_function()

create_function() ist ein kleiner Wrapper um das eval() Sprachkonstrukt, welches die Erzeugung einer Funktion mit einem Funktionsnamen, einer Parameterliste und einem Body-Teil als Argumente erlaubt. Vor der Einführung von closures in PHP 5.3 ermöglichte die Funktion die Erzeugung einer Art von Lambda Funktionen.

Aufgrund der Arbeitsweise von create_function(), abgesehen davon, dass es eine mögliche Quelle für Sicherheitsprobleme darstellt, hat es eine sehr schlechte Performance und Speichernutzung Charakteristik und die Nutzung von echten closures sind in jedem Fall vorzuziehen.

mbstring.func_overload

Die INI-Einstellung mbstring.func_overload gestattet es, eine gewisse Teilmenge von String Funktionen mit denen analog den Funktionen aus der mbstring Erweiterung zu ersetzen. Beispielsweise gibt strlen() nicht mehr die Länge eines Strings in Bytes, sondern die Länge in “code points” gemäß der aktuell gewählten internen Kodierung.

Dies impliziert, dass der Source Code, der mbstring.func_overload verwendet, inkompatibel zum Rest des Programmcodes ist, welcher unter der Annahme programmiert wurde, dass elementare Stringoperationen normal arbeiten würden. Wenn der Source Code func_overload unterstützen soll, so müsste er derart gestaltet werden, dass er zwischen normalen Stringfunktionen und solchen, die mit einer 8bit Kodierung unter der Verwendung von mbstring Funktionen arbeiten, unterscheidet (üblicherweise ist dies jedoch nur für kryptografische Bibliotheken relevant).

(unset) cast

Der (unset) Cast Operator setzt einen Wert auf Null. Das bedeutet, dass (unset) expr ein Ausdruck ist, der immer Null zurückgibt. Abgesehen davon, dass dieses Verhalten nutzlos ist, ist es auch verwirrend, weil viele Entwickler annehmen, dass (unset) $a ähnlich zu unset($a) verhalten wird, während dem in Wirklichkeit nicht so ist.

parse_str() ohne zweites Argument

Die parse_str() Funktion analysiert einen Query String und speichert ihn entweder in ein Array, wenn das zweite Argument verwendet wird, oder in eine lokale Symboltabelle, wenn das zweite Argument nicht verwendet wird. Letzeres Verhalten ist ein Überbleibsel aus den dunklen Zeiten der register_globals. Es leidet an den gleichen Problemen und stellt eine erhebliche Sicherheitslücke bei Verwendung mit Benutzereingaben.

gmp_random()

Die gmp_random() Funktion gibt eine zufällige GMP (GNU Multiple Precision Arithmetic Library) Nummer zwischen 0 und 2**($n*BITS_PER_LIMB)-1, wobei $n das argument der Funktion und BITS_PER_LIMB ein plattformspezifischer Parameter der GMP/MPIR Implementation ist, der nicht näher erläutert ist. Daher muß für die Verwendung dieser Funktion die Limb Größe geschätzt werden und ist auch noch plattformabhängig.

Als Alternative wurde in PHP 5.6 die Funktionen the gmp_random_bits() und gmp_random_range() eingeführt, welche eine präzise Kontrolle über den Bereich der Zufallszahlen erlauben. Diese Funktionen sollten immer gmp_random() vorgezogen werden.

each()

Die Funktion each() kann zum Durchlaufen eines Arrays verwendet werden, ähnlich foreach(). Bei jedem Aufruf gibt es ein Array mit dem aktuellen Schlüssel und Wert zurück und setzt den internen Array Zeiger auf die nächste Position. Die typische Anwedung wird im Handbuch wie folgt dargestellt:


reset($array);
while (list($key, $val) = each($array)) {
    echo "$key => $val\n";
}

Die each() Funktion ist foreach in jeder nur vorstellbarer Weise unterlegen, insbesondere ist sie 10 mal so langsam. Die fortgesetzte Existenz dieser Funktion stellt ein Problem für gewisse Änderungen in PHP dar. Beispielsweise die https://wiki.php.net/rfc/notice-for-non-valid-array-container RFC musste list() ausschließen, weil die typische Anwendung von each darauf vertraut, dass man auf Array Offsets mit false zugreifen kann, ohne dass eine Warnung erzeugt wird.

assert() mit String Argument

Die assert() Funktion hat zwei Anwendungsarten: Wenn etwas anderes als ein String übergeben wird, wird der Wert als wahr angesehen. Wird ein String übergeben, wird eval() durchlaufen und assert prüft, ob das Ergebnis wahr ist.

Der Grund für dieses Verhalten ist, dass vor PHP 7 dies der einzige Weg war, den zu prüfenden Ausdruck vor der Evaluierung zu bewahren. Seit PHP 7, kann die zend.assertions INI-Einstellung verwendet werden, um die Evaluierung des zu prüfenden Ausdrucks zu vermeiden. Daher ist es nicht länger notwendig, implizit evaluierte String Argument zu unterstützen.

Dieses Verhalten von assert() vereinfacht die Angreifbarkeit durch die Einführung einer subtilen Ausführung von entferntem Source Code. Die Verwendung von assert($value) zur Prüfung, ob ein Wert wahr ist, öffnet eine RCE Lücke, wenn die Möglichkeit besteht, dass $value ein String ist.

$errcontext als Argument eines Error Handlers

Errorhandler, die mit set_error_handler() gesetzt werden, erhalten $errcontext als letztes Argument. Dieses Argument ist ein Array, welches alle lokalen Variablen enthält zum Zeitpunkt als der Fehler aufgetreten ist.

Diese Funktionalität ist problematisch für Optimierungszwecke, weil $errcontext verwendet werden kann, um alle Referenzen und Objekte im aktuellen Geltungsbereich zu modifizieren. Diese Funktionalität wird selten verwendet und der Mehrwert ist lohnenswert. Wenn ein Entwickler den Variablenstatus zum Zeitpunkt eines Fehlers einsehen will, so kann er sich besser eines Debuggers bedienen.

Der Fehlerkontext enthält nur die lokalen Variablen auf der Fehlerseite. Der Fehler Backtrace, inklusive $this und Funktionsargumente, sind weiterhin über debug_backtrace() vorhanden.

Ähnliche Artikel:

Fragen oder Feedback zu diesem Artikel

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert