Maison  >  Article  >  Le passionnant PHP7.4

Le passionnant PHP7.4

藏色散人
藏色散人avant
2019-08-28 14:20:0510712parcourir

Le passionnant PHP7.4

PHP 7.4 est la prochaine version mineure de PHP 7 et devrait être mise en disponibilité générale le 28 novembre 2019. Jetons un coup d'œil aux nouvelles fonctionnalités de PHP 7.4 qui rendront PHP plus rapide et plus fiable.

Bien sûr, j'attends avec impatience PHP 8. Étant donné que certaines propositions de JIT ont été approuvées, cela pourrait devenir une autre étape importante pour PHP.

Quoi de neuf en PHP avec PHP 7.4 ?

● Prend en charge le décompression dans les tableaux - opérateur de propagation de tableau

● Fonction flèche 2.0 (fermeture plus courte)

PHP 7.4 dans les tableaux L'opérateur Spread

est introduit dans les expressions et est disponible depuis PHP 5.6. Déballage des paramètres est une syntaxe pour décompresser des tableaux et Traversable dans des listes de paramètres. Pour décompresser un Array ou Traversable, il doit être préfixé par ... (3 points), comme dans l'exemple suivant :

  function test(...$args) { var_dump($args); }
  test(1, 2, 3);

Cependant, PHP 7.4 RFC recommande d'étendre cette fonctionnalité aux tableaux Définition :

  $arr = [...$args];

Le premier avantage de l'opérateur Spread est la performance, et la documentation RPC indique que l'opérateur :

Spread devrait avoir de meilleures performances que array_merge. Ce n'est pas seulement que l'opérateur spread est une construction syntaxique et que array_merge est une méthode. Également au moment de la compilation, les tableaux constants sont optimisés pour une efficacité élevée. Un avantage significatif de l'opérateur

Spread est qu'il prend en charge tout objet traversable, alors que la fonction array_merge ne prend en charge que les tableaux.

Voici un exemple de paramètres dans un tableau avec l'opérateur Spread :

   $parts = ['apple', 'pear'];
  $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
  var_dump($fruits);

Si vous exécutez ce code dans PHP 7.3 ou une version antérieure, PHP générera une erreur d'analyse :

Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3

Au lieu de cela, PHP 7.4 renverra un tableau

array(5) {
    [0]=>
    string(6) "banana"
    [1]=>
    string(6) "orange"
    [2]=>
    string(5) "apple"
    [3]=>
    string(4) "pear"
    [4]=>
    string(10) "watermelon"
  }

La RFC indique que nous pouvons étendre le même tableau plusieurs fois. De plus, nous pouvons utiliser la syntaxe Spread Operator n'importe où dans le tableau puisque des éléments réguliers peuvent être ajoutés avant ou après l'opérateur spread. Par conséquent, le code suivant fonctionnera comme prévu :

$arr1 = [1, 2, 3];
  $arr2 = [4, 5, 6];
  $arr3 = [...$arr1, ...$arr2];
  $arr4 = [...$arr1, ...$arr3, 7, 8, 9];

Il est également possible de passer le tableau renvoyé par la fonction en paramètre et de le mettre dans un nouveau tableau :

function buildArray(){
    return ['red', 'green', 'blue'];
  }
  $arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];

Sorties PHP 7.4 le tableau suivant :

array(6) {
    [0]=>
    string(3) "red"
    [1]=>
    string(5) "green"
    [2]=>
    string(4) "blue"
    [3]=>
    string(4) "pink"
    [4]=>
    string(6) "violet"
    [5]=>
    string(6) "yellow"
  }

On peut aussi utiliser generator :

function generator() {
    for ($i = 3; $i <= 5; $i++) {
        yield $i;
    }
  }
  $arr1 = [0, 1, 2, ...generator()];

mais le passage par référence n'est pas autorisé. Prenons l'exemple suivant :

$arr1 = [&#39;red&#39;, &#39;green&#39;, &#39;blue&#39;];
  $arr2 = [...&$arr1];

Si nous essayons de passer par référence, PHP générera l'erreur d'analyse suivante :

Parse error: syntax error, unexpected &#39;&&#39; in /app/spread-operator.php on line 3

Si les éléments du premier tableau sont stockés par référence, alors ils le sont également stocké par référence dans le deuxième tableau. Voici un exemple :

   $arr0 = &#39;red&#39;;
  $arr1 = [&$arr0, &#39;green&#39;, &#39;blue&#39;];
  $arr2 = [&#39;white&#39;, ...$arr1, &#39;black&#39;];

Voici ce que nous obtenons avec PHP 7.4 :

array(5) {
    [0]=>
    string(5) "white"
    [1]=>
    &string(3) "red"
    [2]=>
    string(5) "green"
    [3]=>
    string(4) "blue"
    [4]=>
    string(5) "black"
  }

Fonctions fléchées 2.0 (fermetures courtes)

En PHP, les fonctions anonymes sont considérées comme très verbeuses et difficiles à implémenter et à maintenir, RFC recommande d'introduire une syntaxe de fonction de flèche (ou de fermeture courte) plus simple et plus claire afin que nous puissions écrire du code de manière concise.

Avant PHP 7.4 :

function cube($n){
    return ($n * $n * $n);
  }
  $a = [1, 2, 3, 4, 5];
  $b = array_map(&#39;cube&#39;, $a);
  print_r($b);

PHP 7.4 permet une syntaxe plus concise, la fonction ci-dessus peut être réécrite comme suit :

$a = [1, 2, 3, 4, 5];
  $b = array_map(fn($n) => $n * $n * $n, $a);
  print_r($b);

Actuellement, en raison de la structure du langage, Les fonctions anonymes (fermetures) peuvent hériter des variables définies dans la portée parent en utilisant use, comme indiqué ci-dessous :

$factor = 10;
  $calc = function($num) use($factor){
    return $num * $factor;
  };

Mais en PHP 7.4, la valeur de la portée parent est capturée implicitement (implicitement liée par la portée de la valeur). On peut donc compléter cette fonction en une seule ligne :

$factor = 10;
  $calc = fn($num) => $num * $factor;

Les variables définies dans le scope parent peuvent être utilisées pour les fonctions fléchées. C'est équivalent à notre utilisation de use et ne peut pas être modifié par le parent.

La nouvelle syntaxe constitue une grande amélioration du langage car elle nous permet de créer un code plus lisible et maintenable.

Opérateur de coalescence NULL

En raison du grand nombre de situations où les expressions ternaires et isset () sont utilisées simultanément dans l'utilisation quotidienne, nous avons ajouté l'opérateur de coalescence nul (? ?) Ce sucre syntaxique. Si la variable existe et n'est pas NULL, elle renvoie sa propre valeur, sinon elle renvoie son deuxième opérande.

$username = $_GET[&#39;user&#39;] ?? ‘nobody&#39;;

Ce que fait ce code est très simple : il récupère le paramètre de requête et définit une valeur par défaut s'il n'existe pas. Mais dans cet exemple RFC, que se passe-t-il si nous avons des noms de variables plus longs ?

$this->request->data[&#39;comments&#39;][&#39;user_id&#39;] = $this->request->data[&#39;comments&#39;][&#39;user_id&#39;] ?? &#39;value&#39;;

长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:

$this->request->data[&#39;comments&#39;][&#39;user_id&#39;] ??= ‘value’;

如果左侧参数的值为 null,则使用右侧参数的值。

注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。

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