Maison  >  Article  >  développement back-end  >  PHP 8 arrive dans six mois, jetons un coup d'œil à ses nouvelles fonctionnalités

PHP 8 arrive dans six mois, jetons un coup d'œil à ses nouvelles fonctionnalités

Guanhui
Guanhuiavant
2020-05-25 10:59:374704parcourir

PHP 8 arrive dans six mois, jetons un coup d'œil à ses nouvelles fonctionnalités

La nouvelle version majeure de PHP, PHP8, devrait sortir d'ici fin 2020.

Il est actuellement en développement très actif, donc le rythme et la progression du développement peuvent varier considérablement au cours des prochains mois.

Dans cet article, je vais énumérer certains des changements qui se produiront dans PHP8 : nouvelles fonctionnalités, améliorations des performances et modifications importantes.

Comme PHP8 est une nouvelle version majeure, la rétrocompatibilité du code et de la syntaxe sera moindre.

Si vous suivez les dernières versions, la mise à niveau ne devrait pas être trop difficile, car la plupart des modifications majeures sont obsolètes dans les versions 7.*.

En plus des changements importants, PHP8 apporte également de nouvelles fonctionnalités intéressantes, telles que le compilateur JIT et les types d'union, et bien sûr, il existe de nombreuses autres fonctionnalités.

Nouvelles fonctionnalités

Commencez par les nouvelles fonctionnalités, mais PHP8 est toujours en développement actif, cette liste s'allongera donc avec le temps.

Types d'union RFC

Compte tenu des caractéristiques de typage dynamique de PHP, les types d'union sont utiles dans de nombreuses situations.

Un type d'union est une collection de deux types ou plus qui indiquent que l'un ou l'autre des deux types peut être utilisé.

public function foo(Foo|Bar $input): int|float;

J'ai l'impression que cela ressemble un peu à l'union en langage C.

Notez que void ne peut jamais faire partie d'un type d'union car cela signifie "aucune valeur de retour du tout".

De plus, pouvez-vous utiliser |NULL ou en utiliser un existant ? .

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

JIT RFC

Le compilateur JIT-Just-In-Time promet des améliorations significatives des performances, même s'il n'y a peut-être pas de grand avantage dans les applications Web.

Il n’existe pas de références précises à ce stade, mais elles émergeront certainement.

Type de retour statique RFC

Bien qu'il soit possible de renvoyer self , static n'était pas un type de retour valide avant PHP8. PHP est utile à de nombreux développeurs compte tenu de sa nature typée dynamiquement.

class Foo
{
    public function test(): static
    {
        return new static();
    }
}

Weak Maps RFC

Une implémentation WeakMap a été ajoutée dans PHP 8 sur la base de la RFC WeakRefs ajoutée dans PHP 7.4. WeakMap contient des références à des objets, ce qui n'empêche pas le garbage collection de ces objets.

En prenant les ORM comme exemple, ils implémentent souvent des caches contenant des références à des classes d'entités pour améliorer les performances des relations entre les entités.

Ces objets d'entité ne peuvent pas être récupérés tant que le cache y fait référence, même si le cache est la seule chose qui les référence.

Si cette couche de mise en cache utilise à la place des références et des mappages faibles, PHP récupérera ces objets lorsqu'ils ne seront plus référencés par d'autres objets.

Surtout dans le cas des ORM, qui peuvent gérer des centaines (voire des milliers) d'entités en une seule requête ; un mappage faible peut fournir un moyen meilleur et plus convivial pour gérer ces objets.

Ce qui suit est l'utilisation des cartes faibles, un exemple de la RFC :

class Foo 
{
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj): object
    {
        return $this->cache[$obj]
           ??= $this->computeSomethingExpensive($obj);
    }
}

Peut être utilisé sur des objets ::class RFC

Une nouvelle fonctionnalité petite mais utile : Vous pouvez désormais utiliser ::class sur des objets sans avoir à utiliser get_class() sur eux.

Cela fonctionne de la même manière que get_class().

$foo = new Foo();
var_dump($foo::class);

Interface de création d'objets DateTime

Vous pouvez déjà créer un objet DateTime à partir d'un objet DateTimeImmutable en utilisant DateTime::createFromImmutable($immutableDateTime), mais l'inverse est délicat .

Avec l'ajout de DateTime::createFromInterface() et DatetimeImmutable::createFromInterface(), il existe désormais un moyen universel de convertir les objets DateTime et DateTimeImmutable les uns vers les autres.

DateTime::createFromInterface(DateTimeInterface $other);
DateTimeImmutable::createFromInterface(DateTimeInterface $other);

Nouvelle interface Stringable RFC

L'interface Stringable peut être utilisée pour taper une invite n'importe quelle chaîne ou implémenter __toString().

De plus, chaque fois qu'une classe implémente __toString(), elle implémente automatiquement l'interface en arrière-plan, pas besoin de l'implémenter manuellement.

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');

Nouvelle fonction str_contains() RFC

Certains pourraient dire que c'est attendu depuis longtemps, mais nous n'avons finalement plus besoin de compter sur strpos() Savoir si un la chaîne contient une autre chaîne.

Auparavant :

if (strpos('string with lots of words', 'words') !== false) { /* … */ }

Maintenant :

if (str_contains('string with lots of words', 'words')) { /* … */ }

Nouvelle fonction fdiv() PR

Nouvelle fonction fdiv() Agit de la même manière que les fonctions fmod() et intdiv(), qui permettent la divisibilité par zéro.

Vous obtiendrez INF, -INF ou NaN au lieu d'une erreur, selon les cas.

Nouvelle fonction get_debug_type() RFC

get_debug_type() renvoie le type d'une variable.

On dirait que gettype() pourrait faire quelque chose.

get_debug_type () renvoie une sortie plus utile pour les tableaux, les chaînes, les classes anonymes et les objets.

Par exemple, appeler gettype() sur la classe fooBar renverra Object.

L'utilisation de get_debug_type () renverra le nom de la classe.

Une liste complète des différences entre get_debug_type() et gettype() peut être trouvée dans la RFC.

Améliorer les méthodes abstraites dans les traits RFC

les traits peuvent spécifier des méthodes abstraites qui doivent être implémentées par les classes qui les utilisent.

Mais il y a une mise en garde : avant PHP8, les signatures de ces implémentations de méthodes n'étaient pas vérifiées.

在以下代码中有效:

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教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer