Maison  >  Article  >  développement back-end  >  Jetons un coup d'œil aux principales nouveautés de php7

Jetons un coup d'œil aux principales nouveautés de php7

coldplay.xixi
coldplay.xixiavant
2020-06-28 16:26:423500parcourir


Jetons un coup d'œil aux principales nouveautés de php7

À partir de maintenant, PHP a officiellement publié la version RC5 de php7. Les principales fonctionnalités de php7 sont désormais définitivement finalisées. il n'y aura plus de changements. Les itérations de certaines versions ultérieures sont principalement des corrections de bugs, des optimisations, etc. Parlons des changements majeurs de PHP7 que nous attendions avec impatience.

Aperçu de la nouvelle fonctionnalité

ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG
增加抽象语法树,使编译更加科学
64位的INT支持
统一的变量语法
原声的TLS - 对扩展开发有意义
一致性foreach循环的改进
新增 <=>、**、?? 、\u{xxxx}操作符
增加了返回类型的声明
增加了标量类型的声明
核心错误可以通过异常捕获了
增加了上下文敏感的词法分析

Recommandations d'apprentissage associées : PHP Programmation du débutant au compétent

Certaines fonctionnalités supprimées

1 Suppression de certaines anciennes extensions et migration vers PECL (telles que : mysql) <.> 2. Suppression de la prise en charge des SAPI
3. Les balises comme
6 Les fonctions statiques ne prennent plus en charge l'appel d'une fonction non statique via un $this

$o = & new className{}. n'est plus pris en charge.

Le fichier 7.php.ini a supprimé # comme commentaire et utilise ; pour commenter



Quelques changements de comportement

Constructeurs avec le même nom dans les paramètres de définition de fonction du type ne sont plus pris en charge (pas actuellement supprimés, mais le seront à l'avenir)String, int , float et autres mots-clés ne peuvent pas être utilisés comme noms de classe

func_get_args() obtient la valeur de la variable actuelle

//PHP5
"0x10" == "16"

//PHP7
"0x10" != "16"

Ci-dessous, nous en avons sélectionné quelques-unes principales et principales qui sont plus pertinentes pour notre PHPer. Laissez-moi vous présenter les fonctionnalités importantes

PHP NG

Le nouveau moteur php a optimisé de nombreux endroits, et c'est officiellement à cause de cela que php7 a de meilleures performances que php5. Près de deux fois l'amélioration ! Reconstruction de la structure ZVAL


A gauche le zval de PHP5 (24 octets), et à droite le zval de PHP7 (16 octets) ;

On voit que le zval de php7 est plus compliqué que celui de php5, mais il peut être réduit de 24 octets à 16 octets. Pourquoi ?

En langage C, chaque variable membre de struct occupe un espace mémoire indépendant, tandis que les variables membres de union partagent un espace mémoire (l'union est largement utilisée pour remplacer struct en php7). Par conséquent, même s’il semble y avoir beaucoup plus de variables membres, l’espace mémoire réellement occupé, dont beaucoup sont publiques, a diminué.

Utilisez le nouveau Zend Array pour remplacer la précédente structure HashTale

Le plus utilisé, le plus utile, le plus pratique et le plus flexible de notre php programmes C'est un tableau, et la couche inférieure de php5 est implémentée par HashTable. php7 utilise le nouveau type Zend Array, et les performances et la vitesse d'accès ont été grandement améliorées ! Certaines fonctions très couramment utilisées et peu coûteuses deviennent directement des opcodes pris en charge par le moteur

function test ($num) {
  $num++;
  var_dump(func_get_args()[0]);
};

test(1)

//PHP5
int(1)

//PHP7
int(2)

Utilise de nouvelles méthodes d'allocation et de gestion de mémoire pour réduire le gaspillage de mémoire

Tri des noyaux zend_sort Optimiser

call_user_function(_array) => ZEND_INIT_USER_CALL
is_int/string/array/* => ZEND_TYPE_CHECK
strlen => ZEND_STRLEN
defined => ZEND+DEFINED

Utilisez le tri par sélection pour les éléments inférieurs à 16, divisez-les en unités de 16 pour les éléments supérieurs à 16, utilisez le tri par sélection séparément, puis combinez-les tous et utilisez le tri rapide. Par rapport au tri précédent, les éléments internes sont passés d'un tri non stable à un tri stable, réduisant le nombre d'échanges d'éléments, réduisant le nombre d'opérations de mémoire et améliorant les performances de 40 %

Arbre de syntaxe abstraite


Si nous avons un tel besoin maintenant, nous devons effectuer une détection de syntaxe sur le fichier source PHP et implémenter des normes de codage. Avant php5, il n'y avait pas d'AST, et les opcodes étaient générés directement depuis l'analyseur ! Nous devons utiliser des analyseurs de syntaxe php externes pour y parvenir ; et php7 ajoute AST, nous pouvons implémenter une telle extension nous-mêmes, et utiliser les fonctions fournies par l'extension pour obtenir directement la structure AST correspondant au fichier, et cette structure est ce qui nous Il peut être identifié, nous pouvons donc faire une certaine optimisation et un jugement sur cette base.

Prise en charge INT 64 bits

Prend en charge le stockage de chaînes de plus de 2 GoPrend en charge le téléchargement de fichiers de plus de 2 GoAssurez-vous que les chaînes sont en [64 -bit] sur toutes les plateformes sont 64 bits

Variables de syntaxe uniforme

//PHP5 - 快速排序(非稳定排序)
array(1 => 0, 0 => 0)

//PHP7 - 快速排序+选择排序(稳定排序)
array(0 => 0, 1 => 0)


Améliorations de la boucle foreach

$$foo[&#39;bar&#39;][&#39;baz&#39;]

//PHP5
($$foo)[‘bar&#39;][&#39;baz&#39;]

//PHP7: 遵循从左到右的原则
${$foo[‘bar&#39;][&#39;baz&#39;]}

Plusieurs nouveaux opérateurs

//PHP5
$a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a));}
int(2)
int(2)
int(2)

$a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a));}
int(2)
int(3)
bool(false)

$a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a));}
int(1)
int(1)
int(1)

//PHP7:不再操作数据的内部指针了
$a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

$a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a))
int(1)
int(1)
int(1)

$a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)
Déclaration de type de retour

//<=> - 比较两个数的大小【-1:前者小于后者,0:前者等于后者,1:前者大于后者】
echo 1 <=> 2;//-1
echo 1 <=> 1;//0
echo 1 <=> 0;//1

// ** - 【a的b次方】
echo 2 ** 3;//8

//?? - 三元运算符的改进
//php5
$_GET[&#39;name&#39;] ? $_GET[&#39;name&#39;] : &#39;&#39;;//Notice: Undefined index: …
//php7
$_GET[&#39;name&#39;] ?? &#39;&#39; -> &#39;&#39;;

//\u{xxxx} - Unicode字符的解析
echo "\u{4f60}";//你
echo "\u{65b0}";//新

Déclaration de type scalaire

function getInt() : int {
  return “test”;
};

getInt();

//PHP5
#PHP Parse error: parse error, expecting &#39;{&#39;...

//PHP7
#Fatal error:Uncaught TypeError: Return value of getInt() must be of the type integer, string returned

Les erreurs de base peuvent être détectées via des exceptions

function getInt(int $num) : int {
  return $num;
};

getInt(“test”);

//PHP5
#PHP Catchable fatal error: Argument 1 passed to getInt() must be an instance of int, string given…

//PHP7
#Fatal error: Uncaught TypeError: Argument 1 passed to getInt() must be of the type integer, string given…

Analyse lexicale contextuelle

try {
  non_exists_func();
} catch(EngineException $e) {
  echo “Exception: {$e->getMessage();}\n”;
}

//这里用php7试了一下还是没法捕获,但是看鸟哥介绍说是可行的。。。
#Exception: Call to undefined function non_exists_func()

C'est tout. J'ai pratiquement terminé ma compréhension préliminaire de php7. Il doit contenir de nombreuses erreurs erronées et de bas niveau. J'espère que vous pourrez les corriger à temps afin que je puisse les corriger et prendre des notes ! hé-hé !

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