Error extraño de PHP: 'No se puede usar el valor de retorno de la función en el contexto de escritura'


178

Recibo este error y no puedo entenderlo.

El mensaje de error exacto es:

Error fatal: no se puede usar el valor de retorno de la función en el contexto de escritura en /home/curricle/public_html/descarga/index.php en la línea 48

La línea 48 es:

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

¿Qué podría estar pasando aquí?

Aquí está la función 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') debería ser $ _POST ['sms_code'], por cierto.
davidtbernal

Además, la cláusula else en la declaración if no es necesaria. $stateno se modificará, no es necesario restablecerlo NOTHING_SUBMITEDsi ya es ese valor.
Glenn Dayton

Gente del futuro, ¿alguien puede explicar qué significa realmente el mensaje?
OGHaza

Respuestas:


111

Quiere decir

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

aunque por cierto realmente quieres decir

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

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

También encontré la solución para el problema que enfrentaba, así que para su información, esto también se aplica a $ _REQUEST (parámetros en la URL de la página).
TheCuBeMan

55
Me doy cuenta de que llego muy tarde a esto, pero también depende de la versión de PHP, ¿verdad? Estoy bastante seguro de que eso es legal en versiones posteriores de PHP como 5.6, pero creo que no lo hace en 5.3
UnsettlingTrend

490

Esto también sucede cuando se usa vacío en una función return:

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

porque vacío no es una función sino una construcción de lenguaje (no estoy seguro), y solo toma variables:

Correcto:

empty($someVar)

Incorrecto:

empty(someFunc())

Desde PHP 5.5, admite más que variables. Pero si lo necesita antes de 5.5, úselo trim($name) == false. De la documentación vacía .


Dang, acabo de recibir este error también, haciendo tu ejemplo exacto (recortar dentro vacío). Gracias x3. Qué extraño error ... Todavía no entiendo completamente: / empty () puede tomar una cadena ... y trim () devuelve una cadena ... entonces, ¿con qué?
Nick Rolando

15
@ Shredder: es porque en empty()realidad no es una función; es una construcción de lenguaje, como echo. El analizador PHP maneja construcciones de lenguaje de manera diferente. En el caso de empty, considera el parámetro como una variable, no como algo a evaluar, por lo que si intenta pasar una función, se rompe. Al menos así lo entiendo. Más información aquí y aquí .
conceda el

1
Este es el error exacto con el que me encontré también. ¿Por qué no es esta la mejor respuesta?
Adam F

2
Mi colega estaba recibiendo este error mientras que yo no. La confusión se produjo, hasta que verifiqué los documentos: a partir de PHP 5.5, empty () aceptará el retorno de una función y una variable. us3.php.net/empty
James Alday

1
Horray por 5.5! Hasta que actualice, puede incluir algo como esto en el archivo de inclusión de su función principal:function mTEE($val){ return empty($val); }
TecBrat

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

cambia esta línea a

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

Estás utilizando parentheseis () para $_POST pero quería corchetes []

:)

O

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

1
No, no puedes escribir "if (isset ($ _ POST ['sms_code'] == TRUE) {", falta un ")".
middus

1
+ varios puntos frescos mil millones para el phrae 'está utilizando paréntesis ... pero que quería corchetes', que era lo que mi problema (que me llevó a esta pregunta) era
Kevin Cuerno

1
Uf, gracias hombre! Ahora, si el analizador dijera "Esperaba corchetes después del nombre de una variable de matriz, ¡duh!", Sonaría mucho más genial que "No se puede usar el valor de retorno de la función en el contexto de escritura". Podría enviar eso a los chicos de PHP como una sugerencia.
Joe Völker

13

para WORDPRESS :

en vez de:

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

debiera ser:

if (!get_option('smth'))

11

Sintaxis correcta (al final le faltaron paréntesis):

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

ps no necesita == TRUE parte, porque BOOLEAN (verdadero / falso) ya ha sido devuelto.


4

Esto puede suceder en más de un escenario, a continuación hay una lista de escenarios bien conocidos:

// 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 paréntesis para acceder a un elemento de una matriz, los paréntesis se usan para llamar a una función

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

Esto también podría activarse cuando intentamos incrementar el resultado de una función como la siguiente:

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

¿Quieres tener bichos? Porque así es como se consiguen los errores. No, pero en serio, nunca hagas esto. Es como hacerlo if(i++), puede parecer más corto que incrementar el contador y luego evaluar su valor, pero te causará dolores de cabeza si alguna vez se produce un error. Editar: no estoy insinuando que lo hagas, solo se lo señalo a los nuevos programadores que leen la respuesta y piensan que es una buena idea, para aumentar los valores al calcular o evaluar lo que se está incrementando.
Victor D.

@VictorD. Solo digo que podría ocurrir un error en esa situación, lo que significa que no es bueno hacerlo.
Mehdi Karamosly

¿Puedo sugerir uno más? Lo haces en =lugar de ==en una declaración if.
Josiah

Para mí era la versión PHP, actualice a 7.0 :)
asiente con la cabeza el

3

El problema está en el ()que tienes que ir[]

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

por

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

3

También tuve un problema similar al tuyo. El problema es que está utilizando una versión antigua de php. He actualizado a PHP 5.6 y el problema ya no existe.


1

Otro escenario en el que se trige este error debido al error de sintaxis:

ucwords($variable) = $string;

1
Es porque ucwordsdevuelve una cadena y el contexto de la llamada es incorrecto, si intenta, por ejemplo $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, con , le mostrará el nuevo valor asignado.
kip

0

También me encontré con este problema debido a un error de sintaxis. Usando "(" en lugar de "[" en el índice de matriz:

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

0

Este error es bastante correcto y destaca un problema de sintaxis contextual. Se puede reproducir realizando cualquier tipo de sintaxis "no asignable". Por ejemplo:

sintaxis de función ($ hello) {.... luego intente llamar a la función como si fuera una propiedad y asignar un valor .... $ this-> Syntax ('Hello') = 'World';

El error anterior se lanzará porque sintácticamente la declaración es incorrecta. La asignación correcta de 'Mundo' no se puede escribir en el contexto que ha utilizado (es decir, sintácticamente incorrecto para este contexto). 'No se puede usar el valor de retorno de la función' o podría leerse 'No se puede asignar el valor de la mano derecha a la función porque es de solo lectura'

El error específico en el código de OP es el resaltado, usando corchetes en lugar de corchetes.


-1

Puede ser causado por un operador incorrecto, =, cuando debería ser ==

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

Este código arroja este error

Tenga en cuenta que = es operador de asignación y no operador de comparación. La solución es cambiar = a ==.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.