web-dev-qa-db-fra.com

Void comme type de retour

Je testais les types de retour avec PHP 7.

J'ai créé un script simple pour tester les types de retour de PHP 7:

<?php

Class Obj {

    public function __construct(){

    }

    public function test(): string { //a string needs to be returned
        return "ok";
    }

}

function foo(): Obj { //instance of Obj needs to be returned
    return new Obj();
}

$o = foo();
echo $o->test(); // output: ok

Désormais, dans d'autres langages de programmation, lorsque vous spécifiez un type de retour void, cela signifie que vous ne pouvez rien retourner ou que vous obtiendrez une erreur. Alors j'ai écrit ce script:

<?php

    function foo(): void {

    }

    foo(); 

Maintenant, dans le script ci-dessus, la sortie attendue n'est rien. Au lieu de cela, cela me donne une erreur fatale:

Erreur fatale: la valeur renvoyée par foo () doit être une instance de void, aucune valeur renvoyée à la ligne 2

Ma question est (je ne l'ai pas trouvée). Dans PHP 7, existera-t-il un type void similaire?

38
Daan

Modifier:

Une nouvelle RFC séparée pour un type de retour void a été publiée, a été approuvée et a été mise en œuvre dans PHP 7.1.
Il existe maintenant un type de retour void en PHP. :)

Message original:

Tiré de wiki.php.net :

Travail futur

Les idées pour les travaux futurs hors du domaine d'application de cette RFC incluent:

  • Autorise les fonctions à déclarer qu'elles ne renvoient rien du tout (void en Java et C)

Il n’existe donc actuellement aucun moyen de déclarer que vous ne retournez rien.
Je ne sais pas ce qu'il y a de mieux dans votre situation, mais je préférerais probablement ne pas déclarer le type de retour pour l'instant.

Pour répondre à votre question s’il existera un type de retour void dans PHP 7:
Il n'y a pas encore garantie, mais je pense qu'il est très probable que void ou un synonyme sera implémenté d'une manière ou d'une autre.

54
Siguza

Auteur des types de retour RFC ici. Dans PHP 7.0, il n'y aura pas de types de retour void puisque le RFC ne l'a pas ajouté et aucun autre ciblage RFC PHP 7.0. 

Le type void peut exister dans la série PHP 7 si nous décidons que l'ajout de nouveaux mots clés/réservés est acceptable pour les versions mineures, même si elles cassent le code. Ceci est quelque peu incertain, mais cela a été fait dans PHP 5.4 avec le mot clé callable.


Personnellement, je ne pense pas que nous ayons besoin de void; nous avons déjà null. Extrait du manuel :

La valeur NULL spéciale représente une variable sans valeur. NULL est la seule valeur possible du type null.

Dans PHP une fonction qui ne retourne rien renverra implicitement null. Cela signifie que vous ne pouvez jamais réellement ne rien renvoyer *. Utiliser la route null signifie qu’il n’ya pas de rupture de compatibilité ascendante puisque null ne sera pas un nom de classe/interface/trait valide commençant par PHP 7.0 et n’ajoute pas de nouvelle clé ou mots réservés.

* Les personnes familières avec le Zend Engine se rendront compte que vous ne pouvez rien retourner, mais si vous ne retournez rien, la variable que vous affectez sera affectée de la valeur null, ce qui les rend logiquement équivalentes.


Dans PHP 7.1, il y aura un pseudo-type void. Il est défini dans le Void Type de renvoi RFC .

Personnellement, je suis triste à ce sujet parce que l'auteur de RFC avait déjà "arrêté" et que j'avais lu le RFC. La prochaine chose que je sais est proposée et en discussion et elle n’attendrait pas que je propose des types de syndicats, ce qui aurait été la contrepartie de nullité comme indiqué ci-dessus. Tant pis.

17
Levi Morrison

Le type voidreturn a été accepté pour php 7.1. Cela viendra donc dans le futur.

Quelques exemples sur son fonctionnement:

function should_return_nothing(): void {
    return 1; // Fatal error: A void function must not return a value
}

function returns_null(): void {
    return null; // Fatal error: A void function must not return a value
}
function lacks_return(): void {
    // valid
}
function returns_nothing(): void {
    return; // valid
}

Voir le RFC de Andrea Faulds pour plus d'informations!

12
acrobat

Il n'y a pas de type équivalent pour void en php, Return NULL; peut correspondre à vos besoins car il n’a aucun type comme 0 ni aucune autre valeur. Note: le vide actuel signifie pas de retour.

1
Sanjay Kumar N S

@BeNice Je comprends votre argument, de toute façon je résume la considération de Levi Morrison en tant que question pratique de durabilité: en introduisant void comme type de retour possible, nous rompons l’hypothèse que le seul type possible de null est null.

De cette façon, void devrait être renvoyé pour la vérification de type de null, en modifiant les contraintes de l’architecture de par leur conception et en créant un désordre dans la compatibilité avec les versions antérieures.

// your choice implies this comparison should be true:
gettype(null) === void;

Je pense que ceux qui ont utilisé null de manière peu fréquente dans son code porteraient l’implémentation de type void.

0