L'attribut NoDiscard

(PHP 8 >= 8.5.0)

Introduction

Cet attribut peut ĂȘtre utilisĂ© pour indiquer que la valeur de retour d'une fonction ou d'une mĂ©thode ne doit pas ĂȘtre ignorĂ©e. Si la valeur de retour n'est utilisĂ©e d'aucune maniĂšre, un avertissement sera Ă©mis.

Cela est utile pour les fonctions oĂč ne pas vĂ©rifier la valeur de retour est probablement un bogue.

Pour ignorer intentionnellement la valeur de retour d'une telle fonction, il est possible d'utiliser le cast (void) pour supprimer l'avertissement.

Note: Étant donnĂ© que les attributs sont conçus pour ĂȘtre rĂ©trocompatibles, #[\NoDiscard] peut ĂȘtre ajoutĂ© aux fonctions et mĂ©thodes mĂȘme lorsque PHP 8.4 ou infĂ©rieur est supportĂ©, il ne fera simplement rien. Sur PHP 8.5 et supĂ©rieur, un avertissement sera Ă©mis si le rĂ©sultat n'est pas utilisĂ©. Pour supprimer l'avertissement sans utiliser (void), qui n'est pas supportĂ© avant PHP 8.5, il est possible d'utiliser une variable comme $_.

Note: #[\NoDiscard] s'applique Ă  la dĂ©claration de fonction ou de mĂ©thode spĂ©cifique sur laquelle il est Ă©crit, et l'avertissement est Ă©mis en fonction de la dĂ©claration rĂ©ellement appelĂ©e. Par consĂ©quent, ajouter #[\NoDiscard] Ă  une mĂ©thode d'interface ou Ă  une mĂ©thode abstraite n'Ă©met pas d'avertissement, car la mĂ©thode invoquĂ©e est la mĂ©thode d'implĂ©mentation ou de redĂ©finition. De mĂȘme, une mĂ©thode qui redĂ©finit une mĂ©thode #[\NoDiscard] n'Ă©met pas l'avertissement Ă  moins d'ĂȘtre elle-mĂȘme marquĂ©e avec l'attribut. À l'inverse, une mĂ©thode importĂ©e depuis un trait conserve l'attribut, car la mĂ©thode du trait est copiĂ©e dans la classe utilisatrice comme si elle y Ă©tait dĂ©clarĂ©e.

Synopsis de la classe

#[\Attribute]
final class NoDiscard {
/* Propriétés */
public readonly ?string $message;
/* Méthodes */
public function __construct(?string $message = null)
}

Propriétés

message
Un message optionnel expliquant pourquoi la valeur de retour ne doit pas ĂȘtre ignorĂ©e.

Exemples

Exemple #1 Utilisation basique

<?php

/**
 * Traite tous les éléments donnés et retourne un tableau avec les résultats de
 * l'opération pour chaque élément. `null` indique un succÚs et une Exception
 * indique une erreur. Les clés du tableau de résultat correspondent aux clés du tableau $items.
 *
 * @param array<string> $items
 * @return array<null|Exception>
 */
#[\NoDiscard("as processing might fail for individual items")]
function bulk_process(array $items): array {
    $results = [];

    foreach ($items as $key => $item) {
        if (\random_int(0, 9999) < 9999) {
            // On prétend faire quelque chose d'utile avec $item,
            // ce qui réussira dans 99,99% des cas.
            echo "Processing {$item}", PHP_EOL;
            $error = null;
        } else {
            $error = new \Exception("Failed to process {$item}.");
        }

        $results[$key] = $error;
    }

    return $results;
}

bulk_process($items);

?>

La sortie de l'exemple ci-dessus en PHP 8.5 est similaire Ă  :

Warning: The return value of function bulk_process() should either be used or intentionally ignored by casting it as (void), as processing might fail for individual items

Exemple #2 Ignorer intentionnellement la valeur de retour

<?php

#[\NoDiscard]
function some_command(): int {
    return 1;
}

// Supprimer l'avertissement avec (void) - PHP 8.5+
(void) some_command();

// Pour la compatibilité avec les versions de PHP antérieures à 8.5, utiliser une variable temporaire
$_ = some_command();

?>

Sommaire

add a note

User Contributed Notes

There are no user contributed notes for this page.