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


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

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

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


447
2017-07-02 16:58


origine


Réponses:


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 est que vous utilisez empty() du tout, croyant à tort que la valeur "vide" est différente de "fausse".

Vide 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), le empty() la fonction 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 $x est défini empty() est redondant).

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

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

est logiquement équivalent à:

if ($r->getError())

740
2017-12-01 19:05



Remarque: C'est une très bonne réponse avec une grande visibilité, mais sachez que cela promeut de mauvaises pratiques de codage inutiles! Voir @ La réponse de Kornel pour la bonne façon.

Note 2: J'approuve les suggestions à 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 l'alternative. L'extrait de code ci-dessous n'est pas recommandé.


C'est une limitation de vide() dans les versions PHP ci-dessous 5.5.

Remarque: vide () vérifie uniquement les variables   toute autre chose se traduira par une analyse   Erreur. En d'autres termes, les éléments suivants   ne fonctionnera pas: vide (trim ($ name)).

Vous devriez changer pour cela

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

327
2017-07-02 17:03



Selon les docs PHP:

empty () ne vérifie que les variables car toute autre chose aboutira à une erreur d'analyse

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


37
2017-07-02 17:02



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);
}

Alors, où que j'aie normalement utilisé empty (), j'utilise simplement is_empty ()


19
2018-01-24 19:40



Comme d'autres l'ont fait remarquer, c'est une limitation (étrange) de vide ().

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

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

4
2017-07-02 17:08



Le problème est ceci, 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 très bien avec ce code sans préavis.

if (!($x->isErrorSet())) {
    echo $x->getError();
}

2
2018-06-12 17:58



La manière alternative de vérifier si un tableau est vide pourrait être:

count($array)>0

Cela fonctionne pour moi sans cette erreur


-3
2018-01-25 08:43