2009-07-02 19 views
436

yo creo que el siguiente fragmento de código debería funcionar, pero no (Editado: Ahora funciona en PHP 5.5 o superior):No se puede utilizar el valor de retorno método en el contexto de escritura

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

Dónde getError() es simplemente:

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

embargo termino con este error:

can't use method return value in write context

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

+2

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

+2

[La guía definitiva para isset de PHP Y vacía] (http://kunststube.net/isset/) – deceze

+0

Ok, me parece [respuesta de porno] (http: //stackoverflow.com/a/4328049/476) también corrija este mi código 'if (! $ e-> find ('div')) 'que verifica si el elemento HTML DOM actual está vacío o no. Lo uso dentro de un bucle para imprimir solo una Div sin div interna dentro de ella. –

Respuesta

726

empty() necesidades para acceder al valor de referencia (con el fin de comprobar si que los puntos de referencia a algo que existe), y PHP antes 5.5 no soportaba referencias a valores temporales devueltos por funciones.

Sin embargo, el verdadero problema que tiene es que utilice empty() en absoluto, creyendo erróneamente que el valor de "vacío" es diferente de "falsa".

Vacío es solo un alias para !isset($thing) || !$thing. Cuando la cosa se está comprobando siempre existe (en los resultados de las llamadas a funciones PHP siempre existe), la función empty() es nada 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) … 

tiene 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 la instrucción return, existe un valor de retorno y contiene null). Por lo tanto:

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

es lógicamente equivalente a:

if ($r->getError()) 
+27

Esta es una respuesta mucho mejor que la seleccionada actualmente . – SystemParadox

+1

empty() es igual a! $ X para la mayoría de los propósitos, no para todos los tipos de var. – gcb

+19

@gcb: no, el manual de PHP dice explícitamente que es idéntico: * "empty() es lo opuesto a' (boolean) var', excepto que no se genera ninguna advertencia cuando la variable no está configurada. "* – Kornel

37

Según the PHP docs:

empty() only checks variables as anything else will result in a parse error

No se puede utilizar directamente en empty() valor de retorno de una función. En su lugar, establecer el regreso de getError() a una variable y ejecutar empty() sobre la variable.

327

Note: This is a very high voted answer with a high visibility, but please note that it promotes bad, unnecessary coding practices! See @Kornel's answer for the correct way.

Note #2: I endorse the suggestions to use @Kornel's answer . When I wrote this answer three years ago, I merely meant to explain the nature of the error, not necessarily endorse the alternative. The code snippet below is not recommended.


Es una limitación de empty() en versiones de PHP por debajo de 5,5.

Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

Habría que cambiar a esta

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

Esto es insanamente contraproducente. –

+29

@David Murdoch php está lleno de pequeñas gemas como esta ... – cbednarski

+47

Nota: Lo mismo ocurre con 'isset()'. ie: 'isset ($ this-> foo-> getBar())' dará como resultado el mismo problema. – catchdave

4

Como se ha comentado en otras, es una limitación (raro) de vacío().

Para la mayoría de purproses, haciendo esto es igual que llamar a vacío, pero esto funciona:

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

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

+3

Es por eso que dice "para * la mayoría de los propósitos *", no * todo * –

19

Por lo general crear una función global llamada is_empty() sólo para evitar este problema

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

A continuación, en cualquier lugar que normalmente tendría usado vacío() Yo solo uso is_empty()

+36

Esto es una mierda. Sí, soluciona el problema. Pero qué hack, cuando el lenguaje debería manejar esto. – manumoomoo

+2

Es mejor no hacer esto y atenerse a los estándares (tan irritantes como puedan ser). – tonyhb

+1

@dynamism podría explicar por qué no? –

2

El problema es esto, quieres saber si el error no esta vacio

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

Adición de un método isErrorSet() va a 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(); 
} 
-3

La forma alternativa de comprobar si un array está vacío podría ser:

count($array)>0 

Funciona para mí sin que el error

Cuestiones relacionadas