Die neue Hauptversion von PHP PHP8 wird voraussichtlich Ende 2020 veröffentlicht.
Es befindet sich derzeit in einer sehr aktiven Entwicklung, sodass Tempo und Fortschritt der Entwicklung in den nächsten Monaten erheblich variieren können.
In diesem Artikel werde ich einige der Änderungen auflisten, die in PHP8 vorgenommen werden: neue Funktionen, Leistungsverbesserungen und Breaking Changes.
Da es sich bei PHP8 um eine neue Hauptversion handelt, ist die Abwärtskompatibilität von Code und Syntax geringer.
Wenn Sie mit den neuesten Versionen Schritt gehalten haben, sollte das Upgrade nicht allzu schwierig sein, da die meisten wichtigen Änderungen in den 7.*-Versionen veraltet sind.
Zusätzlich zu den Breaking Changes bringt PHP8 auch einige tolle neue Features, wie den JIT-Compiler und Union-Typen, und natürlich gibt es noch viele weitere Features.
Neue Funktionen
Beginnen Sie mit den neuen Funktionen, aber PHP8 befindet sich noch in der aktiven Entwicklung, daher wird diese Liste mit der Zeit wachsen.
Union-Typen RFC
Angesichts der dynamischen Typisierungseigenschaften von PHP sind Union-Typen in vielen Situationen nützlich.
Ein Union-Typ ist eine Sammlung von zwei oder mehr Typen, die angeben, dass einer der beiden Typen verwendet werden kann.
public function foo(Foo|Bar $input): int|float;
Ich habe das Gefühl, dass dies der Union in der C-Sprache ein wenig ähnelt.
Beachten Sie, dass void niemals Teil eines Union-Typs sein kann, da dies „überhaupt keinen Rückgabewert“ bedeutet.
Können Sie außerdem |NULL oder ein vorhandenes verwenden? .
public function foo(Foo|null $foo): void; public function bar(?Bar $bar): void;
JIT RFC
Der JIT-Just-In-Time-Compiler verspricht erhebliche Leistungsverbesserungen, obwohl es bei Webanwendungen möglicherweise keine großen Vorteile gibt.
Zum jetzigen Zeitpunkt gibt es keine genauen Benchmarks, aber sie werden sich auf jeden Fall zeigen.
Statischer Rückgabetyp RFC
Obwohl es möglich ist, self zurückzugeben, war static vor PHP8 kein gültiger Rückgabetyp. PHP ist aufgrund seiner dynamisch typisierten Natur für viele Entwickler nützlich.
class Foo { public function test(): static { return new static(); } }
Weak Maps RFC
Eine WeakMap-Implementierung wurde in PHP 8 basierend auf dem in PHP 7.4 hinzugefügten WeakRefs RFC hinzugefügt. WeakMap enthält Verweise auf Objekte, was nicht verhindert, dass diese Objekte durch Garbage Collection erfasst werden.
Am Beispiel von ORMs implementieren sie häufig Caches, die Verweise auf Entitätsklassen enthalten, um die Leistung von Beziehungen zwischen Entitäten zu verbessern.
Diese Entitätsobjekte können nicht durch Müll gesammelt werden, solange der Cache einen Verweis auf sie hat, selbst wenn der Cache das einzige ist, was auf sie verweist.
Wenn diese Caching-Ebene stattdessen schwache Referenzen und Zuordnungen verwendet, sammelt PHP diese Objekte im Garbage Collection, wenn sie nicht mehr von anderen Objekten referenziert werden.
Besonders im Fall von ORMs, die Hunderte (wenn nicht Tausende) von Entitäten in einer einzigen Anfrage verwalten können, kann eine schwache Zuordnung eine bessere und ressourcenschonendere Möglichkeit bieten, mit diesen Objekten umzugehen.
Das Folgende ist die Verwendung von Weak Maps, ein Beispiel aus dem RFC:
class Foo { private WeakMap $cache; public function getSomethingWithCaching(object $obj): object { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } }
Kann auf Objekten verwendet werden::class RFC
Eine kleine, aber nützliche neue Funktion: Jetzt können Sie ::class für Objekte verwenden, ohne get_class() für sie verwenden zu müssen.
Es funktioniert genauso wie get_class().
$foo = new Foo(); var_dump($foo::class);
Schnittstelle zum Erstellen von DateTime-Objekten
Sie können bereits mit DateTime::createFromImmutable($immutableDateTime) ein DateTime-Objekt aus einem DateTimeImmutable-Objekt erstellen, aber die Umkehrung ist schwierig .
Mit der Hinzufügung von DateTime::createFromInterface() und DatetimeImmutable::createFromInterface() gibt es jetzt eine universelle Möglichkeit, DateTime- und DateTimeImmutable-Objekte ineinander und voneinander zu konvertieren.
DateTime::createFromInterface(DateTimeInterface $other); DateTimeImmutable::createFromInterface(DateTimeInterface $other);
Neue Stringable-Schnittstelle RFC
Die Stringable-Schnittstelle kann verwendet werden, um eine beliebige Zeichenfolge einzugeben oder __toString() zu implementieren.
Außerdem implementiert eine Klasse jedes Mal, wenn sie __toString() implementiert, die Schnittstelle automatisch im Hintergrund, ohne dass eine manuelle Implementierung erforderlich ist.
class Foo { public function __toString(): string { return 'foo'; } } function bar(Stringable $stringable) { /* … */ } bar(new Foo()); bar('abc');
Neue str_contains()-Funktion RFC
Manche mögen sagen, das sei längst überfällig, aber wir müssen uns endlich nicht mehr auf strpos() verlassen. Wissen Sie, ob a string enthält einen anderen String.
Früher:
if (strpos('string with lots of words', 'words') !== false) { /* … */ }
Jetzt:
if (str_contains('string with lots of words', 'words')) { /* … */ }
Neue fdiv()-Funktion PR
Neue fdiv()-Funktion Wirkt ähnlich wie die Funktionen fmod() und intdiv(), die eine Teilbarkeit durch Null ermöglichen.
Je nach Fall erhalten Sie INF, -INF oder NaN anstelle einer Fehlermeldung.
Neue get_debug_type()-Funktion RFC
get_debug_type() gibt den Typ einer Variablen zurück.
Klingt, als könnte gettype() etwas bewirken.
get_debug_type() gibt eine nützlichere Ausgabe für Arrays, Strings, anonyme Klassen und Objekte zurück.
Wenn Sie beispielsweise gettype() für die Klasse fooBar aufrufen, wird Object zurückgegeben.
Mit get_debug_type() wird der Klassenname zurückgegeben.
Eine vollständige Liste der Unterschiede zwischen get_debug_type() und gettype() finden Sie im RFC.
Abstrakte Methoden in Traits RFC verbessern
Traits können abstrakte Methoden angeben, die von den Klassen implementiert werden müssen, die sie verwenden.
Aber es gibt einen Vorbehalt: Vor PHP8 wurden die Signaturen dieser Methodenimplementierungen nicht überprüft.
在以下代码中有效:
trait Test { abstract public function test(int $input): int; } class UsesTrait { use Test; public function test($input) { return $input; } }
在使用 traits 并实现其抽象方法时,PHP8 将执行正确的方法签名验证。
这意味着您需要改写以下内容:
class UsesTrait { use Test; public function test(int $input): int { return $input; } }
token_get_all () 的对象接口 RFC
函数的作用是:返回值的是一个数组。
此 RFC 使用 PhpToken::getall () 方法添加一个 PhpToken 类。
此实现使用对象,而不是普通值。
它消耗更少的内存,更容易阅读。
变量语法调整 RFC
来自 RFC:“统一变量语法 RFC 解决了 PHP 变量语法中的一些不一致问题”,这个 RFC 打算解决少数被忽略的情况。
内部函数的类型批注
很多人都参与到为所有内部函数添加适当类型注释的工作中。
这是一个长期存在的问题,通过在以前版本中对 PHP 所做的所有更改,最终可以解决这个问题。
这意味着内部函数和方法在反射中将具有完整的类型信息。
统一错误类型 RFC
PHP 中的用户定义函数已经抛出 TypeErrors,但是内部函数没有抛出 TypeErrors,而是发出警告并返回 NULL。
从 PHP8 开始,内部函数的行为已经保持一致。
重新分类 zend engine 报错 RFC
许多以前只触发警告或通知的错误已转换为适当的错误。
以下警告已更改。
未定义变量:错误异常而不是通知。
未定义的数组索引:警告而不是通知。
被零除:DivisionByZeroError 异常而不是警告。
尝试递增 / 递减非对象的属性‘% s’:错误异常而不是警告。
试图修改非对象的属性‘% s’:错误异常而不是警告。
尝试分配非对象的属性‘% s’:错误异常而不是警告。
从空值创建默认对象:错误异常而不是警告。
正在尝试获取非对象的属性‘% s’:警告而不是通知。
未定义属性:% s::$% s:警告而不是通知。
无法将元素添加到数组,因为下一个元素已被占用:错误异常而不是警告。
无法取消设置非数组变量中的偏移量:错误异常而不是警告。
不能将标量值用作数组:错误异常而不是警告。
只能解包数组和遍历:TypeError 异常而不是警告。
为 foreach () 提供的参数无效:TypeError 异常而不是警告。
偏移类型非法:TypeError 异常而不是警告。
isset 中的偏移类型非法或为空:TypeError 异常而不是警告。
未设置中的偏移类型非法:TypeError 异常而不是警告。
数组到字符串的转换:警告而不是通知。
资源 ID#% d 用作偏移量,转换为整数 (% d):警告而不是通知。
发生字符串偏移量转换:警告而不是通知。
未初始化的字符串偏移量:% d:警告而不是通知。
无法将空字符串分配给字符串偏移量:错误异常而不是警告
默认错误报告级别
现在是 E_ALL,而不是除 E_NOTICE 和 E_DEVERATED 之外的所有内容。
这意味着可能会弹出许多以前被悄悄忽略的错误,尽管在 PHP8 之前可能已经存在。
@运算符不再忽略致命错误
此更改可能会揭示在 PHP8 之前隐藏的错误。请确保在生产服务器上设置 display_errors=off !
串联优先级 RFC
虽然在 PHP7.4 中已不推荐使用,但此更改现在生效。
如果你这样写的话:
echo "sum: " . $a + $b;
PHP 以前会这样解释它:
echo ("sum: " . $a) + $b;
PHP 8 将会这样解释它:
echo "sum: " . ($a + $b);
反射方法签名更改
反射类的三个方法签名已更改:
ReflectionClass::newInstance($args); ReflectionFunction::invoke($args); ReflectionMethod::invoke($object, $args);
现已成为:
ReflectionClass::newInstance(...$args); ReflectionFunction::invoke(...$args); ReflectionMethod::invoke($object, ...$args);
升级指南指定,如果您扩展了这些类,并且仍然希望同时支持 PHP 7 和 PHP 8,则允许以下签名:
ReflectionClass::newInstance($arg = null, ...$args); ReflectionFunction::invoke($arg = null, ...$args); ReflectionMethod::invoke($object, $arg = null, ...$args);
推荐教程:《PHP教程》
Das obige ist der detaillierte Inhalt vonPHP 8 kommt in einem halben Jahr, werfen wir einen Blick auf die neuen Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!