web-dev-qa-db-fra.com

En php, dois-je renvoyer false, null ou un tableau vide dans une méthode qui renverrait généralement un tableau?

J'ai trouvé plusieurs réponses à cela, mais aucune concernant PHP (qui est un langage typé extrêmement faible):

En ce qui concernePHP, est-il approprié de renvoyer false, null ou un tableau vide dans une méthode qui renverrait généralement un tableau, mais en cas d'échec?

En d'autres termes, si un autre développeur se joignait à mon projet, qu'attendraient-ils de lui?

22
xtraorange

Un tableau est une collection de choses. Un tableau vide indiquerait que "tout s'est bien passé, il n'y a simplement rien dans cette collection" . Si vous voulez réellement signaler un error , vous devriez retourner false. Puisque PHP est typé de manière dynamique, il est facile de vérifier la valeur de retour de manière stricte ou non structurée, en fonction de vos besoins:

$result = getCollection();

if (!$result)           // $result was false or empty, either way nothing useful
if ($result === false)  // an actual error occurred
if ($result)            // we have an array with content

Il y a aussi exceptions pour le signalement des erreurs dans exceptionnel cas. Cela dépend vraiment des responsabilités de la fonction et de la gravité des erreurs. Si le rôle de la fonction autorise la réponse "collection vide" et "nope" également, la procédure ci-dessus est satisfaisante. Cependant, si, par définition, la fonction doit toujours renvoyer une collection (même si elle est vide) et qu'elle ne le peut pas dans certaines circonstances, le lancement d'une exception peut être beaucoup plus approprié que de renvoyer false.

37
deceze

Je déconseillerais fortement de renvoyer des valeurs de retour de type mixte. Je considère que c'est tellement un problème que j'ai écrit un petit article sur ne renvoyant pas de valeurs mixtes .

Pour répondre à votre question, retournez un tableau vide. Vous trouverez ci-dessous un petit exemple expliquant pourquoi le renvoi d'autres valeurs peut poser problème:

// This kind of mixed-typed return value (boolean or string),
// can lead to unreliable code!
function precariousCheckEmail($input)
{
  if (filter_var($input, FILTER_VALIDATE_EMAIL))
    return true;
  else
    return 'E-Mail address is invalid.';
}

// All this checks will wrongly accept the email as valid!
$result = precariousCheckEmail('nonsense');
if ($result == true)
  print('OK'); // -> OK will be given out

if ($result)
  print('OK'); // -> OK will be given out

if ($result === false)
  print($result);
else
  print('OK'); // -> OK will be given out

if ($result == false)
  print($result);
else
  print('OK'); // -> OK will be given out

J'espère que cela vous aidera à éviter certains malentendus.

12
martinstoeckli

Pour ma part, je préfère normalement renvoyer un tableau vide, car si la fonction renvoie toujours un tableau, vous pouvez l'utiliser en toute sécurité avec les fonctions de tableau de PHP et foreach (elles accepteront les tableaux vides). Si vous renvoyez null ou false, vous devrez alors vérifier le type du résultat avant de le transmettre à une fonction de tableau.

Si vous devez faire la distinction entre le cas où la méthode s'est exécutée correctement mais n'a trouvé aucun résultat et le cas où une erreur est survenue dans la méthode, les exceptions entrent en jeu. Dans le premier cas, il est prudent de retourner un tableau vide . Dans ce dernier cas, le simple retour d'un tableau vide est insuffisant pour vous informer du fait qu'une erreur s'est produite. Cependant, si vous retournez autre chose qu'un tableau, vous devrez en tenir compte dans le code d'appel. Le lancement d'une exception vous permet de gérer les erreurs ailleurs dans un gestionnaire d'erreurs approprié et de joindre un message et un code à l'exception pour décrire la raison de l'échec.

Le pseudo-code ci-dessous retournera simplement un tableau vide si nous ne trouvons rien d'intéressant. Cependant, si quelque chose ne va pas lors du traitement de la liste des choses que nous avons récupérées, une exception est levée.

method getThings () {
    $things = array ();
    if (get_things_we_are_interested_in ()) {
        $things [] = something_else ();
    } 
    if (!empty ($things)) {
        if (!process_things ($things)) {
            throw new RuntimeExcpetion ('Things went wrong when I tried to process your things for the things!');
        }
    }
    return $things;
}
4
GordonM

Cela dépend de la situation et de la gravité de l'erreur, mais une bonne option (et souvent négligée) consiste à lancer une exception :

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

Cela garantira que votre fonction n'échouera pas en silence et que les erreurs ne disparaîtront pas.

2
MrGlass

Je suppose que le type de retour de votre méthode est array, vous devriez donc renvoyer un tableau vide uniquement si l'exécution s'est bien déroulée mais qu'aucun résultat n'a été trouvé.

En cas d'erreur, vous devriez lancer une exception. Cela devrait être le moyen préféré pour gérer les erreurs.

Celui que vous préfériez, bien que je suggère un tableau vide pour la bonne raison. Vous n'avez pas à vérifier le type d'abord!

<?php
function return_empty_array() {
    return array();
}

$array = return_empty_array();

// there are no values, thus code within doesn't get executed
foreach($array as $key => $value) {
    echo $key . ' => ' . $value . PHP_EOL;
}
?>

Dans tous les autres cas, si vous renvoyez false ou null, vous obtiendrez une erreur au niveau de la boucle foreach.

C'est une différence minuscule, bien qu'à mon avis une grande. Je ne veux pas vérifier le type de valeur que j'ai obtenu, je veux supposer que c'est un tableau. S'il n'y a pas de résultats, c'est un tableau vide.

Quoi qu'il en soit, en ce qui me concerne, il n'y a pas de "valeurs par défaut" pour retourner des valeurs vides. Les fonctions natives PHP continuent de me surprendre par les valeurs très différentes qu’elle renvoie. Parfois faux, parfois nul, parfois un objet vide.

0
Tim S.

S'il y a vraiment un problème, alors vous devriez générer une erreur, sinon, si les critères ne sont pas remplis, etc., retournez un tableau vide.

0
TomDunning