web-dev-qa-db-fra.com

Plusieurs types de retour php 7

J'ai quelques méthodes qui peuvent retourner l'un des deux types de retour - (J'utilise un framework utilisant MCV, donc la refactorisation de ces quelques fonctions en particulier n'est pas attrayante)

Est-il possible de déclarer le type de retour renvoyant l'un ou l'autre et échouant sur autre chose?

function test(): ?
{
    if ($this->condition === false) {
        return FailObject;
    }

    return SucceedObject;
}
37
myol

À l'heure actuelle, la méthode prise en charge consiste à partager une interface entre les deux objets. Exemple:

interface ReturnInterface {}
class FailObject implements ReturnInterface {}
class SuccessObject implements ReturnInterface {}
function test(): ReturnInterface {}

Dans cet exemple, ReturnInterface est vide. Sa simple présence prend en charge la déclaration de type de retour nécessaire.


Actuellement, PHP la communauté interne débat de types d'union. Si la proposition actuelle est acceptée, PHP 8+ prend en charge les retours multiples. les types:

function test(): FailObject|SuccessObject {}

Un type de syndicat antérieur RFC était cependant décliné.


Je préfère l'approche d'interface quels que soient les types d'union. Pour moi, c'est plus clair et plus extensible. Si je veux plus tard un WarnObject, je dois simplement le définir comme une extension de ReturnInterface - plutôt que de parcourir toutes les signatures et de les mettre à jour en FailObject|SuccessObject|WarnObject.

69
bishop

Comme l'a noté Bishop, il existe une RFC permettant d'ajouter plusieurs types de retour. Cependant, je pensais ajouter que depuis PHP7.1, vous pouvez maintenant spécifier un type de retour nullable comme ceci:

function exampleFunction(string $input) : ?int
{
    // Do something
}

Donc, cette fonction prendrait une chaîne et en ajoutant le point d'interrogation avant int, vous lui permettrez de renvoyer null ou un entier.

Voici un lien vers la documentation: http://php.net/manual/en/functions.returning-values.php

Et voici une citation de cette page expliquant l'utilisation: PHP 7.1 autorise les types de retour void et null en faisant précéder la déclaration du type par un? par exemple, la fonction canReturnNullorString ():? String)

Aussi, voici un autre fil qui se rapporte à ceci: --- (types de retour nullables en PHP7

40
david.lee

PHP à partir de 7.2 prend en charge le type de retour d'objet

http://php.net/manual/en/migration72.new-features.php

function test(object $obj) : object
// return any type of object ...
18
visualex

Ce n'est pas la bonne façon:

function test(): ?
{
    if ($this->condition === false) {
        return FailObject;
    }

    return SucceedObject;
}

Le type de retour multiple est une mauvaise pratique. Bonnes pratiques:

Vous devriez définir une exception:

class FailObjectException extends \Exception
{
    private $exampleExtraInfo;

    public function __construct($exampleExtraInfo, $message)
    {
        parent::__construct($message);
        $this->exampleExtraInfo = $exampleExtraInfo;
    }

    public function exampleExtraInfo(): int
    {
        return $this->exampleExtraInfo;
    }
}

Maintenant, vous pouvez définir une fonction comme:

function test(): SucceedObject
{
    if ($this->condition === false) {
        throw new FailObjectException(...,...);
    }

    return SucceedObject;
}

Et utilisez cette fonction avec try/catch:

try{
    $succeedObject = $any->test();
} catch (FailObjectException $exception){
    //do something
}
0
calmohallag