Utilisation de l'opérateur d'assignement de fusion null PHP

Publié le 09/09/2022 • Mis à jour le 09/09/2022


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment utiliser l'opérateur d'assignement de fusion null PHP. On apprend tous les jours, j'avais complétement oublié cette nouvelle fonctionnalité introduite dans PHP 7.4. On connait tous l'opérateur de fusion null classique ??, car il nous simplifie grandement la vie depuis PHP 7.0. L'opérateur d'assignement de fusion null PHP, comme son nom l'indique, permet d'utiliser l'opérateur de fusion null et d'assigner le résultat en même temps. Dans l'exemple suivant, on assigne une valeurs à la clé bar3, celle-ci ne peut pas être définie, car les deux précédentes clés aléatoires ont une longueur de huit caractères. La valeur bar3 est donc bien assignée. Mais dans la dernière assignation, la valeur n'est pas modifiée parce que la clé existe déjà. On utilise array_key_last, et le tableau contient trois valeurs, donc ça retournera toujours la dernière clé foo que nous avons affectée précédemment.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use Symfony\Component\String\ByteString;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet217Trait
{
    public function snippet217(): void
    {
        $myArray = [];
        $myArray[ByteString::fromRandom(8)->toString()] = 'bar1';
        $myArray[ByteString::fromRandom(8)->toString()] = 'bar2';

        $myArray['foo'] ??= 'bar3';

        var_dump($myArray);

        $myArray[array_key_last($myArray)] ??= 'not modified';

        var_dump($myArray);

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Plus sur le web

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use PHPUnit\Framework\TestCase;
use Symfony\Component\String\ByteString;

/**
 * @see Snippet217Trait
 */
final class Snippet217Test extends TestCase
{
    /**
     * @see Snippet217Trait::snippet217
     */
    public function testSnippet217(): void
    {
        $myArray = [];
        $myArray[ByteString::fromRandom(8)->toString()] = 'bar1';
        $myArray[ByteString::fromRandom(8)->toString()] = 'bar2';
        $myArray['foo'] ??= 'bar3';
        self::assertSame('bar3', $myArray['foo']);

        $myArray[array_key_last($myArray)] ??= 'not modified';
        self::assertSame('bar3', $myArray['foo']);
    }
}