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

Resuelto Extrakun asked hace 54 años • 8 respuestas

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

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

Donde getError()es simplemente:

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

Sin embargo, termino con este error:

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

¿Qué quiere decir esto? ¿No es esto sólo una lectura?

Extrakun avatar Jan 01 '70 08:01 Extrakun
Aceptado

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

Sin embargo, el verdadero problema que tiene es que no lo utiliza empty()en absoluto, creyendo erróneamente que el valor "vacío" no es diferente del "falso".

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

PHP no tiene el 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) …

siempre tiene el mismo resultado, en todos los casos, para todos los tipos de datos (porque $xestá definido empty()es redundante).

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

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

es lógicamente equivalente a:

if ($r->getError())
Kornel avatar Dec 01 '2010 19:12 Kornel

Nota: Esta es una respuesta muy votada y de 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 n.º 2: apoyo las sugerencias de utilizar la respuesta de @Kornel . Cuando escribí esta respuesta hace tres años, simplemente pretendía explicar la naturaleza del error, no necesariamente respaldar la alternativa. No se recomienda el siguiente fragmento de código.


Es una limitación de vacío() en versiones de PHP inferiores a 5.5.

Nota: vacío() solo verifica las variables ya que cualquier otra cosa resultará en 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))
Peter Bailey avatar Jul 02 '2009 17:07 Peter Bailey

Antes de PHP 5.5, los documentos PHP solían decir:

vacío() sólo comprueba las variables ya que cualquier otra cosa dará lugar a un error de análisis

En PHP <5.5 no se podía usar empty()directamente en el valor de retorno de una función. En su lugar, puede asignar el retorno de getError()a una variable y ejecutarlo empty()en la variable.

En PHP >= 5.5 esto ya no es necesario.

George Claghorn avatar Jul 02 '2009 17:07 George Claghorn

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

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

Luego, en cualquier lugar donde normalmente habría usado vacío(), solo uso is_empty()

Luke P M avatar Jan 24 '2011 19:01 Luke P M

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

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

if ($r->getError() != '')
Jani Hartikainen avatar Jul 02 '2009 17:07 Jani Hartikainen