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

465

Je pense que le code suivant devrait fonctionner, mais il ne fonctionne pas (Modifié: fonctionne maintenant en PHP 5.5+) :

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

getError()est tout 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 ça veut dire? N'est-ce pas juste une lecture?

Extrakun
la source
2
Probablement en PHP 5.5, vous serez autorisé à passer des expressions à empty: wiki.php.net/rfc/empty_isset_exprs
Carlos Campderrós
Ok, je trouve que la réponse de porneL est correcte aussi 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 de la boucle pour imprimer uniquement un seul Div sans Div interne à l'intérieur.
Salem

Réponses:

769

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 renvoyées par les fonctions.

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

Vide n'est qu'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 empty()fonction n'est rien d'autre qu'un opérateur de négation .

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

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

et ça:

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

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

La valeur de retour de la méthode existe toujours (même si vous n'avez pas d' returninstruction, la valeur de retour existe et contient null). Donc:

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

est logiquement équivalent à:

if ($r->getError())
Kornel
la source
29
C'est une bien meilleure réponse que celle actuellement sélectionnée.
SystemParadox
20
@gcb: non, le manuel PHP dit explicitement qu'il 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."
Kornel
16
La partie ne générant pas d'avertissement est assez importante ... vide ($ var) retournera vrai si c'est 0, '', array (), NULL, ou même pas défini. C'est une bonne pratique, en particulier pour que vous puissiez enregistrer vos vrais avertissements sans que les fichiers ne se remplissent
Landons
3
Ok, bonne réponse, mais quelle est la bonne façon d'éviter cela, quelqu'un le sait-il?
Javatar
3
@EugenMihailescu en général qui est ok, mais ce n'est pas strictement équivalent à vide (), car "", 0etc. sont « vides », mais pas nul.
Kornel
330

Remarque: Il s'agit d'une réponse très votée avec une grande visibilité, mais veuillez noter qu'elle favorise de mauvaises pratiques de codage inutiles! Voir la réponse de @ Kornel pour la bonne façon.

Note # 2: J'approuve les suggestions pour utiliser la 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, pas nécessairement approuver l'alternative. L'extrait de code ci-dessous n'est pas recommandé.


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

Remarque: empty () vérifie uniquement les variables car toute autre chose entraînera une erreur d'analyse. En d'autres termes, ce qui suit ne fonctionnera pas: empty (trim ($ name)).

Il faudrait changer pour ça

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))
Peter Bailey
la source
156
C'est incroyablement contre-productif.
David Murdoch
47
Remarque: la même chose est vraie avec isset(). c'est-à-dire: isset($this->foo->getBar())entraînera le même problème.
catchdave
7
La réponse de porneL explique cela plus en détail, avec une meilleure solution
SystemParadox
5
@SystemParadox - Dépend de ce que vous entendez par "mieux". La réponse de porneL est sans doute plus approfondie avec une solution "plus propre", mais n'explique pas non plus l'origine de l'erreur.
Peter Bailey
4
Parce que ce n'est pas faux, @deceze. Ce n'est pas la meilleure réponse, vous n'obtiendrez aucun argument de ma part. J'ai même voté pour PorneL moi-même. C'est une réponse très ancienne mais ce n'est pas faux . Concernant les votes élevés: rappelez-vous, les porneL sont arrivés près de 17 mois après celui-ci.
Peter Bailey
37

Selon les documents PHP :

empty () vérifie uniquement les variables car toute autre chose entraînera une erreur d'analyse

Vous ne pouvez pas utiliser empty()directement la valeur de retour d'une fonction. Au lieu de cela, définissez le retour de getError()sur une variable et exécutez- empty()la.

George Claghorn
la source
19

Je crée généralement une fonction globale appelée is_empty () juste pour contourner ce problème

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

Ensuite, n'importe où j'aurais normalement utilisé empty () J'utilise simplement is_empty ()

Luke PM
la source
2
Il vaut mieux ne pas le faire et s'en tenir aux normes (aussi ennuyeuses qu'elles puissent être).
tonyhb
1
@dynamisme pourriez-vous expliquer pourquoi pas?
Janis Veinbergs
1
Parce que les fonctions pratiques peuvent être difficiles à lire dans le code de quelqu'un d'autre. De plus, dans une architecture MVC / HMVC, il peut gâcher votre structure. À la fin de la journée, les codeurs PHP devraient connaître ses limites et être capables de comprendre les petites solutions de contournement sans fonctions pratiques.
tonyhb
14
Wow, vous venez d'inventer une fonction de négation . Vous savez que PHP a un !opérateur pour cela? :)
Kornel
4

Comme souligné par d'autres, c'est une limitation (étrange) de empty ().

Pour la plupart des purproses, faire cela équivaut à appeler vide, mais cela fonctionne:

if ($r->getError() != '')
Jani Hartikainen
la source
5
Ce n'est pas vrai - empty()couvre bien plus de possibilités qu'une simple chaîne vierge
Robbie Averill
3
C'est pourquoi il est dit "pour la plupart des cas ", pas tous
Jani Hartikainen
2

Le problème est le suivant, vous voulez savoir si l'erreur n'est pas vide.

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

L'ajout d'une méthode isErrorSet () résoudra le problème.

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

Maintenant, cela fonctionnera bien avec ce code sans préavis.

if (!($x->isErrorSet())) {
    echo $x->getError();
}
Jean Carlo Bambalan
la source
-3

L'autre façon de vérifier si un tableau est vide pourrait être:

count($array)>0

Cela fonctionne pour moi sans cette erreur

quardas
la source