Strano errore PHP: "Impossibile utilizzare il valore restituito dalla funzione nel contesto di scrittura"


178

Ricevo questo errore e non riesco a capirlo.

Il messaggio di errore esatto è:

Errore irreversibile: impossibile utilizzare il valore restituito dalla funzione nel contesto di scrittura in /home/curricle/public_html/descarga/index.php sulla riga 48

La linea 48 è:

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

Cosa potrebbe succedere qui?

Ecco la funzione completa:

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

22
$ _POST ('sms_code') dovrebbe essere $ _POST ['sms_code'], comunque.
davidtbernal,

Inoltre, la clausola else sull'istruzione if non è necessaria. $statenon verrà modificato, non è necessario reimpostarlo NOTHING_SUBMITEDse è già quel valore.
Glenn Dayton,

Persone del futuro, qualcuno può spiegare cosa significa effettivamente il messaggio?
OGHaza,

Risposte:


111

Intendi

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

anche se per inciso intendi davvero

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

3
... oppure if (isset($_POST['sms_code']) === TRUE ) {:-)
KeyboardSmasher

Ho anche trovato la soluzione al problema che stavo affrontando, quindi FYI - questo vale anche per $ _REQUEST (parametri nell'URL della pagina).
TheCuBeMan il

5
Mi rendo conto di essere super in ritardo, ma dipende anche dalla versione di PHP, giusto? Sono abbastanza sicuro che è legale nelle versioni successive di PHP come 5.6, ma penso che non lo sia in 5.3
UnsettlingTrend

490

Ciò accade anche quando si utilizza vuoto su un ritorno di funzione:

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

perché vuoto non è una funzione ma un costrutto di linguaggio (non sicuro) e richiede solo variabili:

Destra:

empty($someVar)

Sbagliato:

empty(someFunc())

A partire da PHP 5.5, supporta più delle variabili. Ma se ne hai bisogno prima del 5.5, usa trim($name) == false. Da documentazione vuota .


Dang, ho appena ricevuto anche questo errore, facendo il tuo esempio esatto (tagliare il vuoto). Grazie x3. Che strano errore .. Ancora non capisco del tutto: / empty () può prendere una stringa .. e trim () restituisce una stringa .. quindi wth?
Nick Rolando,

15
@Shredder - È perché in empty()realtà non è una funzione; è un costrutto linguistico, come echo. Il parser PHP gestisce i costrutti del linguaggio in modo diverso. Nel caso di empty, considera il parametro come una variabile, non qualcosa da valutare, quindi se si tenta di passare una funzione, si interrompe. Almeno questa è la mia comprensione. Maggiori informazioni qui e qui .
concessione

1
Questo è anche l'errore esatto in cui mi sono imbattuto. Perché questa non è la risposta migliore !?
Adam F,

2
Il mio collega stava riscontrando questo errore mentre io no. Ne seguì la confusione, fino a quando non ho controllato i documenti - a partire da PHP 5.5, empty () accetterà il ritorno da una funzione e da una variabile. us3.php.net/empty
James Alday,

1
Horray per 5.5! Fino a quando non function mTEE($val){ return empty($val); }
esegui l'

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

cambia questa riga in

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

Stai usando parentheseis () per $_POSTma volevi parentesi quadre []

:)

O

if (isset($_POST['sms_code']) && $_POST['sms_code']) { 
//this lets in this block only if $_POST['sms_code'] has some value 

1
No, non puoi scrivere "if (isset ($ _ POST ['sms_code'] == TRUE) {", manca un ")".
middus,

1
+ diversi miliardi di punti interessanti per il phrae "stai usando la parentesi ... ma volevi parentesi quadre", che era il mio problema (che mi ha portato a questa domanda)
Kevin Horn,

1
Grazie amico! Ora, se il parser dicesse "Mi aspettavo parentesi quadre dopo il nome di una variabile di matrice, duh!", Suonerebbe molto più fresco di "Impossibile utilizzare il valore restituito dalla funzione nel contesto di scrittura". Potrei inviarlo ai ragazzi di PHP come suggerimento.
Joe Völker,

13

per WORDPRESS :

invece di:

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

dovrebbe essere:

if (!get_option('smth'))

11

Sintassi corretta (alla fine mancavano le parentesi):

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

ps non hai bisogno di == TRUE parte, perché BOOLEAN (vero / falso) viene già restituito.


4

Questo può accadere in più di uno scenario, di seguito è riportato un elenco di scenari ben noti:

// 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

// usando la parentesi per accedere a un elemento di un array, le parentesi vengono utilizzate per chiamare una funzione

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

Questo potrebbe anche essere attivato quando proviamo ad incrementare il risultato di una funzione come di seguito:

$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.

Vuoi ottenere bug? Perché è così che ottieni bug. No, ma sul serio, non farlo mai. È come fare if(i++), può sembrare più breve dell'incremento del contatore e quindi della valutazione del suo valore, ma ti causerà mal di testa se dovesse mai essere eliminato. Modifica: non sto insinuando che lo fai, semplicemente indicandolo a nuovi programmatori che leggono la risposta e pensano che questa sia una cosa ordinata, per aumentare i valori mentre si calcola o si valuta ciò che viene incrementato.
Victor D.

@VictorD. Sto solo dicendo che potrebbe verificarsi un errore in quella situazione, il che significa che non è bene farlo.
Mehdi Karamosly,

Posso suggerirne uno in più? Lo fai =invece che ==in un'istruzione if.
Josiah

Per me era la versione di PHP, l'aggiornamento a 7.0 :)
annod

3

Il problema è che ()devi andare[]

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

di

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

3

Ho anche avuto un problema simile al tuo. Il problema è che stai usando una vecchia versione di php. Ho aggiornato a PHP 5.6 e il problema non esiste più.


1

Un altro scenario in cui questo errore viene superato per errore di sintassi:

ucwords($variable) = $string;

1
È perché ucwordsrestituisce una stringa e il contesto della chiamata non è corretto, se provi ad esempio con $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, allora ti mostra il nuovo valore assegnato.
Termina il

0

ho anche riscontrato questo problema a causa di un errore di sintassi. Utilizzando "(" anziché "[" nell'indice dell'array:

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

0

Questo errore è corretto ed evidenzia un problema di sintassi contestuale. Può essere riprodotto eseguendo qualsiasi tipo di sintassi "non assegnabile". Per esempio:

sintassi della funzione ($ hello) {.... quindi prova a chiamare la funzione come se fosse una proprietà e assegna un valore .... $ this-> Sintassi ('Hello') = 'World';

L'errore precedente verrà generato perché sintatticamente l'istruzione è errata. L'assegnazione corretta di "Mondo" non può essere scritta nel contesto che hai usato (cioè sintatticamente errato per questo contesto). "Impossibile utilizzare il valore restituito dalla funzione" oppure leggere "Impossibile assegnare il valore a destra alla funzione perché è di sola lettura"

L'errore specifico nel codice OP è evidenziato, usando parentesi anziché parentesi quadre.


-1

Può essere causato da un operatore sbagliato, =, quando dovrebbe essere ==

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

Questo codice genera questo errore

Si noti che = è un operatore di assegnazione e non un operatore di confronto. La correzione è cambiare = in ==.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.