475 votes

Impossible d'utiliser la valeur de retour d'une méthode dans un contexte d'écriture

Je pensais que le code suivant devrait fonctionner, mais ce n'est pas le cas. (Modifié : fonctionne maintenant en PHP 5.5+) :

if (!empty($r->getError()))

Donde getError() est simplement :

public function getError()
{
    return $this->error;
}

Pourtant, je me retrouve avec cette erreur :

ne peut pas utiliser la valeur de retour de la méthode dans le contexte d'écriture

Qu'est-ce que cela signifie ? Ce n'est pas juste une lecture ?

2 votes

Probablement qu'en PHP 5.5, vous serez autorisé à passer des expressions à la fonction empty : wiki.php.net/rfc/empty_isset_exprs

2 votes

0 votes

Ok je trouve Réponse de porneL correct aussi ceci mon code if ( !$e->find('div') ) qui vérifie si l'élément HTML DOM actuel est vide ou non. Je l'utilise à l'intérieur d'une boucle pour imprimer un seul Div sans Div interne à l'intérieur.

784voto

porneL Points 42805

empty() doit accéder à la valeur par référence (afin de vérifier si cette référence pointe vers quelque chose qui existe), et PHP avant 5.5 ne supportait pas les références aux valeurs temporaires retournées par les fonctions.

Cependant, le véritable problème que vous avez est que vous utilisez empty() du tout, croyant à tort que la valeur "vide" est différente de la valeur "fausse".

Empty est juste un alias pour !isset($thing) || !$thing . Lorsque la chose que vous vérifiez existe toujours (en PHP, les résultats des appels de fonction existent toujours), la fonction empty() La fonction est rien d'autre qu'un opérateur de négation .

PHP n'a pas le concept de vide . Les valeurs qui évaluent à false sont vides, les valeurs qui évaluent à true sont non vides. C'est la même chose. Ce code :

$x = something();
if (empty($x)) …

et ceci :

$x = something();
if (!$x) …

a toujours le même résultat, dans tous les cas, pour tous les types de données (parce que $x est défini empty() est redondant).

La valeur de retour de la méthode existe toujours (même si vous ne disposez pas de return la valeur de retour existe et contient null ). Par conséquent :

if (!empty($r->getError()))

est logiquement équivalent à :

if ($r->getError())

30 votes

C'est une bien meilleure réponse que celle qui est actuellement choisie.

1 votes

Empty() est égal à !$x dans la plupart des cas, mais pas pour tous les types de variables.

20 votes

@gcb : non, le manuel PHP dit explicitement que c'est identique : "empty() est l'opposé de (boolean) var sauf qu'aucun avertissement n'est généré lorsque la variable n'est pas définie".

331voto

Peter Bailey Points 62125

Note : Il s'agit d'une réponse très votée avec une grande visibilité, mais veuillez noter qu'elle encourage des pratiques de codage mauvaises et inutiles ! Voir Réponse de @Kornel pour le bon chemin.

Note #2 : J'approuve les suggestions d'utiliser Réponse de @Kornel . Lorsque j'ai écrit cette réponse il y a trois ans, je voulais simplement expliquer la nature de l'erreur, sans nécessairement approuver l'alternative. L'extrait de code ci-dessous n'est pas recommandé.


C'est une limitation de vide() dans les versions de PHP inférieures à 5.5.

Note : empty() vérifie seulement les variables comme toute autre méthode entraînera une erreur d'analyse erreur. En d'autres termes, la commande suivante ne fonctionnera pas : empty(trim($name)).

Vous devriez changer pour ceci

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

157 votes

C'est follement contre-productif.

47 votes

Remarque : il en va de même pour isset() . ie : isset($this->foo->getBar()) entraînera le même problème.

7 votes

La réponse de porneL explique cela plus en détail, avec une meilleure solution

38voto

George Claghorn Points 6665

Avant PHP 5.5, l'option la documentation PHP avait l'habitude de dire :

empty() ne vérifie que les variables car toute autre vérification entraînerait une erreur d'analyse.

En PHP < 5.5, vous ne pouviez pas utiliser la fonction empty() directement sur la valeur de retour d'une fonction. Au lieu de cela, vous pouvez affecter le retour de getError() à une variable et exécutez empty() sur la variable.

En PHP >= 5.5, cela n'est plus nécessaire.

19voto

Luke P M Points 400

J'ai l'habitude de créer une fonction globale appelée is_empty() juste pour contourner ce problème.

function is_empty($var)
{ 
 return empty($var);
}

Ensuite, partout où j'aurais normalement utilisé empty(), j'utilise is_empty().

2 votes

Il est préférable de ne pas le faire et de s'en tenir aux normes (aussi ennuyeuses soient-elles).

1 votes

@dynamism pouvez-vous expliquer pourquoi ?

1 votes

Parce que les fonctions de commodité peuvent être une douleur à lire dans le code de quelqu'un d'autre. De plus, dans une architecture MVC/HMVC, elles peuvent perturber votre structure. En fin de compte, les codeurs PHP devraient connaître ses limites et être capables de comprendre les petites solutions de contournement sans fonctions de commodité.

4voto

Jani Hartikainen Points 23183

Comme d'autres l'ont souligné, c'est une limitation (bizarre) de empty().

Pour la plupart des bourses, faire cela revient à dire qu'elles sont vides, mais cela fonctionne :

if ($r->getError() != '')

5 votes

Ce n'est pas vrai - empty() couvre beaucoup plus de possibilités qu'une simple chaîne vide

3 votes

C'est pourquoi il est dit "pour la plupart des objectifs ", pas tous

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X