No se puede usar el valor de retorno del método en el contexto de escritura

6 minutos de lectura

No se puede usar el valor de retorno del método en el contexto de escritura
Extrakun

Creo que el siguiente fragmento de código debería funcionar, pero no es así. (Editado: ahora funciona en PHP 5.5+):

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

Donde getError() es simple:

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

Sin embargo, termino con este error:

no se puede usar el valor de retorno del método en el contexto de escritura

¿Qué significa esto? ¿No es esto solo una lectura?

  • Probablemente en PHP 5.5 se le permitirá pasar expresiones a empty: wiki.php.net/rfc/empty_isset_exprs

    – Carlos Campderrós

    31 de julio de 2012 a las 7:44

  • La guía definitiva para isset y vacío de PHP

    – deceze

    31 de julio de 2012 a las 8:04

  • Ok, encuentro que la respuesta de porneL también es correcta, este es mi código if ( !$e->find('div') ) que comprueban si el elemento HTML DOM actual está vacío o no. Lo uso dentro del bucle para imprimir solo un solo Div sin Div interno dentro de él.

    – Salem

    22 de junio de 2015 a las 18:17


No se puede usar el valor de retorno del método en el contexto de escritura
Kornel

empty() necesita acceder al valor por referencia (para verificar si esa referencia apunta a algo que existe), y PHP antes de 5.5 no admitía referencias a valores temporales devueltos por funciones.

Sin embargo, el verdadero problema que tienes es que usas empty() en absoluto, creyendo erróneamente que el valor “vacío” es diferente de “falso”.

Vacío es solo un alias para !isset($thing) || !$thing. Cuando lo que está comprobando siempre existe (en PHP, los resultados de las llamadas a funciones siempre existen), el empty() la función es nada más que un operador de negación.

PHP no tiene concepto de vacío. Los valores que se evalúan como falso están vacíos, los valores que se evalúan como verdadero no están vacíos. Es lo mismo. Este código:

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

y esto:

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

posee siempre el mismo resultado, en todos los casos, para todos los tipos de datos (porque $x se define empty() es redundante).

El valor de retorno del método siempre existe (incluso si no tiene return instrucción, el valor devuelto existe y contiene null). Por lo tanto:

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

es lógicamente equivalente a:

if ($r->getError())

  • Esta es una respuesta mucho mejor que la seleccionada actualmente.

    – Paradoja del sistema

    9 de septiembre de 2011 a las 14:20

  • @gcb: no, el manual de PHP dice explícitamente que es idéntico: “vacío() es lo contrario de (boolean) varexcepto que no se genera ninguna advertencia cuando la variable no está configurada”.

    – Kornel

    4 oct 2011 a las 23:33

  • La parte de no generar una advertencia es bastante importante… vacío ($var) devolverá verdadero si es 0, ”, array(), NULL o ni siquiera está definido. Es una buena práctica, particularmente para que pueda registrar su verdadero advertencias sin que se llenen los archivos

    – aterrizar

    15 de noviembre de 2011 a las 14:15

  • Ok, gran respuesta, pero ¿cuál es la forma correcta de evitar esto, alguien sabe?

    – Javatar

    20 de enero de 2013 a las 22:34

  • @EugenMihailescu en general está bien, pero no es estrictamente equivalente a vacío (), porque "", 0etc. están “vacíos”, pero no nulos.

    – Kornel

    11 de abril de 2014 a las 11:19

No se puede usar el valor de retorno del método en el contexto de escritura
pedro bailey

Nota: Esta es una respuesta muy votada con una gran visibilidad, pero tenga en cuenta que promueve prácticas de codificación malas e innecesarias. Consulte la respuesta de @Kornel para conocer la forma correcta.

Nota 2: Apoyo las sugerencias de usar la respuesta de @Kornel. Cuando escribí esta respuesta hace tres años, simplemente quise explicar la naturaleza del error, no necesariamente respaldar la alternativa. No se recomienda el fragmento de código siguiente.


es una limitacion de vacío() en versiones de PHP por debajo de 5.5.

Nota: vacío () solo verifica las variables, ya que cualquier otra cosa dará como resultado un error de análisis. En otras palabras, lo siguiente no funcionará: vacío (trim ($ nombre)).

Tendrías que cambiar a esto

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

  • Esto es increíblemente contraproducente.

    –David Murdoch

    23 de diciembre de 2010 a las 20:26

  • Nota: Lo mismo ocurre con isset(). es decir: isset($this->foo->getBar()) resultará en el mismo problema.

    – catchdave

    24 de junio de 2011 a las 23:45

  • la respuesta de porneL explica esto con más detalle, con una mejor solución

    – Paradoja del sistema

    9 de septiembre de 2011 a las 14:21

  • @SystemParadox: depende de lo que quieras decir con “mejor”. Podría decirse que la respuesta de porneL es más completa con una solución “más limpia”, pero tampoco explica el origen del error.

    –Peter Bailey

    12 de septiembre de 2011 a las 22:22

  • Porque no está mal, @deceze. No es la mejor respuesta, no obtendrás ningún argumento de mí allí. Incluso voté a favor de porneL. Es un muy viejo responde pero no es incorrecto. Con respecto a los votos altos: recuerda, el de porneL llegó casi 17 meses después de este.

    –Peter Bailey

    31/07/2012 a las 20:30


Antes de PHP 5.5, el los documentos PHP solía decir:

vacío () solo verifica las variables, ya que cualquier otra cosa dará como resultado un error de análisis

En PHP empty() directamente en el valor de retorno de una función. En su lugar, podría asignar el retorno de getError() a una variable y ejecutar empty() en la variable.

En PHP >= 5.5 esto ya no es necesario.

Normalmente creo una función global llamada is_empty() solo para solucionar este problema

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

Entonces, en cualquier lugar que normalmente hubiera usado vacío (), solo uso is_empty ()

Como señalaron otros, es una limitación (extraña) de vacío().

Para la mayoría de los propósitos, hacer esto es igual a llamar a vacío, pero esto funciona:

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

  • Esto no es cierto – empty() cubre muchas más posibilidades que solo una cadena en blanco

    – scrowler

    7 de abril de 2015 a las 3:44

  • Por eso dice “por la mayoría de los propósitos“, no todos

    – Jani Hartikainen

    7 de abril de 2015 a las 6:49


No se puede usar el valor de retorno del método en el contexto de escritura
Jean Carlo Bambalan

El problema es este, desea saber si el error no está vacío.

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

Agregar un método isErrorSet() resolverá el problema.

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

Ahora esto funcionará bien con este código sin previo aviso.

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

  • Esto no es cierto – empty() cubre muchas más posibilidades que solo una cadena en blanco

    – scrowler

    7 de abril de 2015 a las 3:44

  • Por eso dice “por la mayoría de los propósitos“, no todos

    – Jani Hartikainen

    7 de abril de 2015 a las 6:49


No se puede usar el valor de retorno del método en el contexto de escritura
Miguel

No estoy seguro de si esto sería un error común, pero si haces algo como:

$var="value" .= 'value2';

esto también producirá el mismo error

No se puede usar el valor de retorno del método en el contexto de escritura

no puedes tener un = y un .= en la misma declaración. Puedes usar uno u otro, pero no ambos.

Tenga en cuenta que entiendo que esto no está relacionado con el código real de la pregunta; sin embargo, esta pregunta es el resultado principal al buscar el mensaje de error, por lo que quería publicarlo aquí para completarlo.

¿Ha sido útil esta solución?