Maison développement back-end PHP7 Modifications apportées à PHP7 par le nouvel arbre de syntaxe abstraite (AST)

Modifications apportées à PHP7 par le nouvel arbre de syntaxe abstraite (AST)

May 14, 2020 am 11:12 AM
php php7

Modifications apportées à PHP7 par le nouvel arbre de syntaxe abstraite (AST)

La majeure partie du contenu de cet article est basée sur le document RFC de l'AST : https://wiki.php.net/rfc/abstract_syntax_tree , Des extraits du document source sont introduits pour faciliter la compréhension.

Cet article ne vous dira pas ce qu'est un arbre de syntaxe abstraite. Vous devez le comprendre vous-même. Cet article décrit uniquement certains changements qu'AST apporte à PHP.

Nouveau processus d'exécution

Un changement important dans le cœur de PHP7 est l'ajout d'AST. En PHP5, le processus d'exécution des scripts php en opcodes est :

1. Lexing : analyse lexicale, conversion des fichiers sources en flux de jetons

2. généré à ce stade.

3. En PHP7, les tableaux op ne sont plus directement générés lors de l'étape d'analyse syntaxique, mais AST est généré en premier, il y a donc une étape supplémentaire dans le processus :

4. analyse d'analyse lexicale, conversion du fichier source en flux de jetons

5. Analyse syntaxique, génération d'un arbre de syntaxe abstrait à partir du flux de jetons

6. arbre syntaxique.

Temps d'exécution et consommation de mémoire

D'après les étapes ci-dessus, il s'agit d'une étape de plus que le processus précédent, donc selon le bon sens, cela augmentera l'exécution du programme utilisation du temps et de la mémoire. Mais en fait, l'utilisation de la mémoire a effectivement augmenté, mais le temps d'exécution a diminué.

Les résultats suivants sont obtenus en testant trois scripts : petit (environ 100 lignes de code), moyen (environ 700 lignes) et grand (environ 2800 lignes de script de test : https). ://gist.github.com/nikic/289b0c7538b46c2220bc

Temps d'exécution de la compilation de chaque fichier 100 fois (à noter que le temps de résultat du test de l'article est de 14 ans, PHP7 est aussi appelé PHP-NG ) :


php-ng php-ast diff
SMALL 0.180s 0.160s -12.5%
MEDIUM 1.492s 1.268s -17.7%
LARGE 6.703s 5.736s -16.9%


Pic de mémoire dans une seule compilation :

+71,3%

php-ng php-ast diff
SMALL 378kB 414kB +9.5%
MEDIUM 507kB 643kB +26.8%
LARGE 1084kB 1857kB +71.3%
php-ng php-ast diff
PETIT 378 Ko 414 Ko +9,5 %
MOYEN 507 Ko 643 ko +26,8 %
LARGE 1 084 ko 1 857 ko

Les résultats des tests d'une seule compilation peuvent ne pas représenter l'utilisation réelle. Voici les résultats d'un test de projet complet utilisant PhpParser. :


php-ng php-ast diff
TIME 25.5ms 22.8ms -11.8%
MEMORY 2360kB 2482kB +5.1%
php-ng php-ast diff
TEMPS 25,5 ms 22,8 ms - 11,8%
MÉMOIRE 2360 Ko 2482 Ko +5,1%

Les tests montrent qu'après l'utilisation d'AST, le temps d'exécution global du programme est amélioré d'environ 10 à 15 %, mais la consommation de mémoire augmente également. L'augmentation est évidente dans une seule compilation de fichiers volumineux, mais pas dans la. tout le processus d’exécution du projet. Problème très grave.

Notez également que les résultats ci-dessus sont tous sans Opcache. Lorsque Opcache est activé dans un environnement de production, l'augmentation de la consommation de mémoire n'est pas un gros problème.

Changements sémantiques

S'il ne s'agit que d'une optimisation temporelle, cela ne semble pas être une raison suffisante pour utiliser AST. En fait, la mise en œuvre d’AST ne repose pas sur des considérations d’optimisation du temps, mais sur la résolution de problèmes de syntaxe. Jetons un coup d'œil à quelques changements de sémantique.

yield ne nécessite pas de parenthèses

Dans l'implémentation PHP5, si vous utilisez rendement dans un contexte d'expression (comme sur le côté droit d'une expression d'affectation), vous Vous devez utiliser des parenthèses des deux côtés de la déclaration de rendement :

<?php
$result = yield fn();   // 不合法的
$result = (yield fn()); // 合法的
Copier après la connexion

Ce comportement est uniquement dû aux limitations d'implémentation de PHP5. En PHP7, les parenthèses ne sont plus nécessaires. Ainsi les méthodes d'écriture suivantes sont également légales :

<?php
$result = yield;
$result = yield $v;
$result = yield $k => $v;
Copier après la connexion

Bien entendu, vous devez suivre les scénarios d'application du rendement.

Les crochets n'affectent pas le comportement

En PHP5, ($foo)['bar'] = 'baz' et $foo['bar'] = 'baz « Les significations des deux déclarations sont différentes. En fait, l'ancienne façon d'écrire est illégale, et vous obtiendrez l'erreur suivante :

<?php
($foo)[&#39;bar&#39;] = &#39;baz&#39;;
# PHP Parse error: Syntax error, unexpected &#39;[&#39; on line 1
Copier après la connexion

Mais en PHP7, les deux façons d'écrire signifient la même chose.

De même, si les paramètres de la fonction sont mis entre parenthèses, il y a un problème avec la vérification de type. Ce problème a également été résolu en PHP7 :

<?php
function func() {
    return [];
}

function byRef(array &$a) {
}

byRef((func()));
Copier après la connexion

Le code ci-dessus n'alertera pas. PHP5 à moins que byRef ne soit utilisé (func()), mais en PHP7, qu'il y ait ou non des parenthèses des deux côtés de func(), l'erreur suivante se produira :

PHP Strict standards: Only variables should be passed by reference ...
Copier après la connexion

Changements dans la liste( )

<🎜 Le comportement du mot clé >list a beaucoup changé. L'ordre dans lequel la liste attribue des valeurs aux variables (l'ordre à gauche et à droite du signe égal en même temps) était autrefois de droite à gauche, mais maintenant il est de gauche à droite :

<?php
list($array[], $array[], $array[]) = [1, 2, 3];
var_dump($array);

// PHP5: $array = [3, 2, 1]
// PHP7: $array = [1, 2, 3]

# 注意这里的左右的顺序指的是等号左右同时的顺序,
# list($a, $b) = [1, 2] 这种使用中 $a == 1, $b == 2 是没有疑问的。
Copier après la connexion

La raison du changement ci-dessus est précisément parce que dans le processus d'affectation de PHP5, 3 seront remplis dans le tableau en premier, 1 en dernier, mais maintenant l'ordre a changé.

Les mêmes changements sont :

<?php
$a = [1, 2];
list($a, $b) = $a;

// PHP5: $a = 1, $b = 2
// PHP7: $a = 1, $b = null + "Undefined index 1"
Copier après la connexion

En effet, dans le processus d'affectation précédent, $b a d'abord obtenu 2, puis la valeur de $a est devenue 1, mais maintenant $a change en premier. devient 1 et n'est plus un tableau, donc $b devient nul.

La liste n'est désormais accessible qu'une seule fois par offset :

<?php
list(list($a, $b)) = $array;

// PHP5:
$b = $array[0][1];
$a = $array[0][0];

// PHP7:
// 会产生一个中间变量,得到 $array[0] 的值
$_tmp = $array[0];
$a = $_tmp[0];
$b = $_tmp[1];
Copier après la connexion

Les membres de liste vide sont désormais totalement interdits, auparavant seulement dans certains cas :

<?php
list() = $a;           // 不合法
list($b, list()) = $a; // 不合法
foreach ($a as list()) // 不合法 (PHP5 中也不合法)
Copier après la connexion

L'ordre de référence assignation

L'ordre d'affectation de référence est de droite à gauche en PHP5, et le présent est de gauche à droite :

<?php
$obj = new stdClass;
$obj->a = &$obj->b;
$obj->b = 1;
var_dump($obj);

// PHP5:
object(stdClass)#1 (2) {
  ["b"] => &int(1)
  ["a"] => &int(1)
}

// PHP7:
object(stdClass)#1 (2) {
  ["a"] => &int(1)
  ["b"] => &int(1)
}
Copier après la connexion

__la méthode clone peut appeler directement

Vous pouvez désormais utiliser directement $obj->__clone() pour appeler la méthode __clone. __clone était la seule méthode magique dont il était auparavant interdit d'appeler directement. Auparavant, vous obteniez une erreur comme celle-ci :

Fatal error: Cannot call __clone() method on objects - use &#39;clone $obj&#39; instead in ...
Copier après la connexion

Cohérence de la syntaxe variable

AST a également résolu certaines syntaxes. problèmes de cohérence, ces problèmes ont été soulevés dans une autre RFC :

https://wiki.php.net/rfc/uniform_variable_syntax.

Dans la nouvelle implémentation, les significations de certaines expressions grammaticales précédentes sont quelque peu différentes de celles actuelles. Pour plus de détails, veuillez vous référer au tableau suivant :

Expression PHP5 PHP7
$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz']
$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']
$foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']()
Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Dans l'ensemble, l'ordre est toujours de droite à gauche avant, et maintenant de gauche. à droite, tout en suivant le principe selon lequel les parenthèses n’affectent pas le comportement. Ces méthodes complexes d’écriture de variables doivent être prises en compte dans le développement réel.

Tutoriel recommandé : "

PHP7"

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système? Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système? Mar 31, 2025 pm 11:54 PM

Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système. Chaque fois que le système redémarre, nous devons exécuter la commande suivante pour modifier les autorisations d'UnixSocket: sudo ...

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

See all articles