Erreur PHP étrange: `` Impossible d'utiliser la valeur de retour de la fonction dans le contexte d'écriture ''

178

J'obtiens cette erreur et je ne peux pas en faire la tête ou la queue.

Le message d'erreur exact est:

Erreur fatale: impossible d'utiliser la valeur de retour de la fonction dans le contexte d'écriture dans /home/curricle/public_html/descarga/index.php à la ligne 48

La ligne 48 est:

if (isset($_POST('sms_code') == TRUE ) {

Que pourrait-il se passer ici?

Voici la fonction complète:

function validate_sms_code() {

    $state = NOTHING_SUBMITED;

    if (isset($_POST('sms_code') == TRUE ) {
        $sms_code = clean_up($_POST('sms_code'));
        $return_code = get_sepomo_code($sms_code);

        switch($return_code) {

          case 1:
            //no error
            $state = CORRECT_CODE;
            break;

          case 2:
            // code already used
            $state = CODE_ALREADY_USED;
            break;

          case 3:
            // wrong code
            $state = WRONG_CODE;
            break;

          case 4:
            // generic error
            $state = UNKNOWN_SEPOMO_CODE;
            break;

          default:
            // unknown error
            $state = UNKNOWN_SEPOMO_CODE;
            throw new Exception('Unknown sepomo code: ' . $return_code);
            break;
        }

    } else {
        $state = NOTHING_SUBMITED;
    }
    dispatch_on_state($state);
}
cfischer
la source
22
$ _POST ('sms_code') devrait être $ _POST ['sms_code'], au fait.
davidtbernal
De plus, la clause else de l'instruction if n'est pas nécessaire. $statene sera pas modifié, pas besoin de le réinitialiser NOTHING_SUBMITEDsi c'est déjà cette valeur.
Glenn Dayton
Gens du futur, quelqu'un peut-il expliquer ce que signifie réellement le message?
OGHaza

Réponses:

111

Vous voulez dire

if (isset($_POST['sms_code']) == TRUE ) {

bien qu'incidemment tu veux vraiment dire

if (isset($_POST['sms_code'])) {
le chaos
la source
3
... ou if (isset($_POST['sms_code']) === TRUE ) {:-)
keyboardSmasher
J'ai également trouvé la solution au problème auquel je faisais face, donc pour info - cela vaut aussi pour $ _REQUEST (paramètres dans l'URL de la page).
TheCuBeMan
5
Je me rends compte que je suis très en retard, mais cela dépend aussi de la version de PHP, non? Je suis presque sûr que c'est légal dans les versions ultérieures de PHP comme 5.6, mais je pense que ce n'est pas le cas dans 5.3
UnsettlingTrend
490

Cela se produit également lors de l'utilisation de empty sur un retour de fonction:

!empty(trim($someText)) and doSomething()

car vide n'est pas une fonction mais une construction de langage (pas sûr), et il ne prend que des variables:

Droite:

empty($someVar)

Faux:

empty(someFunc())

Depuis PHP 5.5, il prend en charge plus que des variables. Mais si vous en avez besoin avant la version 5.5, utilisez trim($name) == false. De la documentation vide .

Rolfen
la source
Dang, je viens de recevoir cette erreur aussi, en faisant votre exemple exact (couper à l'intérieur vide). Merci x3. Quelle étrange erreur .. Je ne comprends toujours pas tout à fait: / empty () peut prendre une chaîne .. et trim () renvoie une chaîne .. alors wth?
Nick Rolando
15
@Shredder - C'est parce que ce empty()n'est pas réellement une fonction; c'est une construction de langage, comme echo. L'analyseur PHP gère les constructions de langage différemment. Dans le cas de empty, il considère le paramètre comme une variable, pas comme quelque chose à évaluer, donc si vous essayez de passer une fonction, cela se brise. Du moins, c'est ce que je comprends. Plus d'infos ici et ici .
accorder le
1
C'est aussi l'erreur exacte que j'ai rencontrée. Pourquoi n'est-ce pas la meilleure réponse!?
Adam F
2
Mon collègue recevait cette erreur alors que je ne l'étais pas. La confusion s'est ensuivie, jusqu'à ce que je vérifie la documentation - à partir de PHP 5.5, empty () acceptera le retour d'une fonction ainsi que d'une variable. us3.php.net/empty
James Alday
1
Horray pour 5,5! Jusqu'à la mise à niveau, vous pouvez ajouter quelque chose comme ceci dans votre fichier d'inclusion de fonction principale:function mTEE($val){ return empty($val); }
TecBrat
22
if (isset($_POST('sms_code') == TRUE ) {

changer cette ligne en

if (isset($_POST['sms_code']) == TRUE ) {

Vous utilisez parentheseis () pour $_POST mais vous vouliez des crochets []

:)

OU

if (isset($_POST['sms_code']) && $_POST['sms_code']) { 
//this lets in this block only if $_POST['sms_code'] has some value 
TigreTigre
la source
1
Non, vous ne pouvez pas écrire "if (isset ($ _ POST ['sms_code'] == TRUE) {", il manque un ")".
middus
1
+ plusieurs milliards de points intéressants pour le phrae `` vous utilisez des parenthèses ... mais vous vouliez des crochets '', ce qui était mon problème (qui m'a conduit à cette question)
Kevin Horn
1
Ouf, merci mec! Maintenant, si l'analyseur disait "Je m'attendais à des crochets après le nom d'une variable de tableau, duh!", Cela sonnerait beaucoup plus cool que "Impossible d'utiliser la valeur de retour de fonction dans le contexte d'écriture." Je pourrais soumettre cela aux gars de PHP à titre de suggestion.
Joe Völker
13

pour WORDPRESS :

au lieu de:

if (empty(get_option('smth')))

devrait être:

if (!get_option('smth'))
T.Todua
la source
11

Syntaxe correcte (il vous manquait des parenthèses à la fin):

if (isset($_POST['sms_code']) == TRUE ) {
                            ^

ps vous n'avez pas besoin de == TRUE pièce, car BOOLEAN (vrai / faux) est déjà renvoyé.

Middus
la source
4

Cela peut se produire dans plusieurs scénarios, voici une liste de scénarios bien connus:

// calling empty on a function 
empty(myFunction($myVariable)); // the return value of myFunction should be saved into a variable
// then you can use empty on your variable

// en utilisant des parenthèses pour accéder à un élément d'un tableau, les parenthèses sont utilisées pour appeler une fonction

if (isset($_POST('sms_code') == TRUE ) { ...
// that should be if(isset($_POST['sms_code']) == TRUE)

Cela pourrait également être déclenché lorsque nous essayons d'incrémenter le résultat d'une fonction comme ci-dessous:

$myCounter = '356';

$myCounter = intVal($myCounter)++; // we try to increment the result of the intVal...
// like the first case, the ++ needs to be called on a variable, a variable should hold the the return of the function then we can call ++ operator on it.
Mehdi Karamosly
la source
Voulez-vous obtenir des bogues? Parce que c'est ainsi que vous obtenez des bugs. Non mais sérieusement, ne fais jamais ça. C'est comme faire if(i++), cela peut sembler plus court que d'incrémenter le compteur puis d'évaluer sa valeur, mais cela vous causera des maux de tête si jamais il bogue. Edit: Je n'implique pas que vous le faites, je le signale simplement aux nouveaux programmeurs qui lisent la réponse et pensent que c'est une bonne chose, pour incrémenter des valeurs tout en calculant ou en évaluant ce qui est incrémenté.
Victor D.
@VictorD. Je dis simplement qu'une erreur pourrait se produire dans cette situation, ce qui signifie qu'il n'est pas bon de le faire.
Mehdi Karamosly
Puis-je en suggérer un de plus? Vous faites =au lieu de ==dans une instruction if.
Josiah
Pour moi, c'était la version PHP,
passez à la
3

Le problème est que ()tu dois partir[]

if (isset($_POST('sms_code') == TRUE)

par

if (isset($_POST['sms_code'] == TRUE)
Diego
la source
3

J'ai également eu un problème similaire au vôtre. Le problème est que vous utilisez une ancienne version de php. J'ai mis à niveau vers PHP 5.6 et le problème n'existe plus.

husnix
la source
1

Un autre scénario dans lequel cette erreur est déclenchée en raison d'une erreur de syntaxe:

ucwords($variable) = $string;
tomelin5
la source
1
C'est parce que ucwordsretourner une chaîne et le contexte de l'appel est incorrect, si vous essayez par exemple avec $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, alors montrez-vous la nouvelle valeur assignée.
kip le
0

J'ai également rencontré ce problème en raison d'une erreur de syntaxe. Utilisation de "(" au lieu de "[" dans l'index du tableau:

   foreach($arr_parameters as $arr_key=>$arr_value) {
        $arr_named_parameters(":$arr_key") = $arr_value;
    }
Shaakir
la source
0

Cette erreur est tout à fait juste et met en évidence un problème de syntaxe contextuelle. Peut être reproduit en exécutant n'importe quelle sorte de syntaxe "non assignable". Par exemple:

function Syntaxe ($ hello) {.... puis essayez d'appeler la fonction comme si une propriété et attribuer une valeur .... $ this-> Syntax ('Hello') = 'World';

L'erreur ci-dessus sera générée car la syntaxe de l'instruction est erronée. La bonne affectation de «Monde» ne peut pas être écrite dans le contexte que vous avez utilisé (c'est-à-dire syntaxiquement incorrecte pour ce contexte). 'Impossible d'utiliser la valeur de retour de la fonction' ou il pourrait lire 'Impossible d'attribuer la valeur de droite à la fonction car elle est en lecture seule'

L'erreur spécifique dans le code OP est telle que mise en évidence, en utilisant des crochets au lieu de crochets.

user12845085
la source
-1

Peut être causé par un opérateur erroné, =, alors qu'il devrait être ==

if(mysql_num_rows($result) = 1)
    return $result;
else
    return false;

Ce code lève cette erreur

Notez que = est un opérateur d'affectation et non un opérateur de comparaison. Le correctif consiste à changer = en ==.

Hammad Khan
la source