2011-04-06 19 views
18

en cuenta lo siguiente:objeto a un valor lógico

class MyClass 
{ 
    private $var1 = "apple"; 
    private $var2 = "orange"; 
} 

$obj = new MyClass(); 

if($obj) { 
    // do this 
} 
else { 
    // do that 
} 

PHP evalúa mi objeto cierto, ya que tiene variables miembro. ¿Puede esta lógica ser anulada de alguna manera? En otras palabras, ¿puedo tener control sobre lo que evaluará un objeto de mi clase cuando se trate como un booleano?

+0

No, hasta el momento, sólo podemos controlarlo en la fundición de cadena. – Wrikken

+0

¿Por qué necesita tener ese comportamiento inusual? –

+1

Lo mejor que puede lograr es 'if ($ obj())' o 'if (" $ obj ")' o 'if (count ($ obj))' en lugar de la evaluación booleana. – mario

Respuesta

16

PHP evalúa mi objeto como verdadero porque tiene variables de miembro.

Esto es incorrecto. PHP realmente evalúa $obj como true porque contiene un objeto. No tiene nada que ver con el contenido del objeto. Puede verificar esto eliminando los miembros de su definición de clase, no hará ninguna diferencia en qué rama de if/else se elige.

No hay forma de que PHP evalúe una variable como falsa si contiene una referencia a un objeto. Habría que asignar una de las siguientes acciones para la primera variable:

null 
array() 
"" 
false 
0 
+2

Es cierto. Para aclarar para el OP, '$ obj' no es el objeto.Más bien, es una * referencia * a la ubicación del objeto, utilizado por PHP para encontrar el punto en la memoria donde comienza el objeto real. – AgentConundrum

6

No, no se puede. Lamentablemente, la conversión booleana en php no es modificable, y un objeto siempre volverá a ser verdadero cuando se convierta en booleano.

Puesto que usted tiene claramente una lógica que significa colocar en esa sentencia de control, por qué no definir un método en el objeto (decir "isValid()") que verifica las condiciones que desea comprobar y, a continuación, volver a colocar:

if ($obj) 

con:

if ($obj->isValid()) 
+0

Sí, creo que esto es lo que tendré que hacer, pero solo quería simplificar la codificación un poco. –

15

lo mejor que puede hacer es usar __invoke:

class MyObject { 

    private $_state; 

    public function __construct($state = false) { 
     $this->_state = $state; 
    } 

    public function __invoke() { 
     return $this->_state; 
    } 

} 

$true = new MyObject(true); 
$false = new MyObject(false); 

var_dump($true()); // true 
var_dump($false()); // false 
-2

Puede hacerlo así: (bool) $ yourObject

se

2

Puede utilizar pequeña extensión para php7: https://github.com/p1ncet/obcast. Como se puede ver a partir de la descripción, que permite convertir un objeto a booleano mediante la implementación de nueva Boolable interfaz interna:

$obj = new class implements Boolable { 
    public $container = []; 
    public function __toBoolean() { 
     return count($this->container) > 0; 
    } 
}; 

var_dump((bool) $obj); 

$obj->container = [1]; 
var_dump((bool) $obj); 

de salida:

bool(false) 
bool(true) 
+1

Extraño por qué esto no es una función incorporada. Esperaría que haya uno como este debido a la presencia de '__toString()' desde PHP 5.2 –

0

Lo siento por llegar tarde, pero yo sólo jugaba con similares tarea y han hecho algún tipo de truco/solución. Observe el patrón "$object" que llama al método __toString.

class tst { 
    public $r = true; 
    function __toString() { return $this->r ? "1" : "0"; } 
} 
$object = new tst(); 
$object->r = true; 
echo '<br />1: '; 
if ("$object") echo 'true!'; else echo 'false!'; // "$object" becomes "1" == true 
//echo "$object" ? 'true!' : 'false!'; 

$object->r = false; 
echo '<br />0: '; 
echo "$object" ? 'true!' : 'false!'; // "$object" becomes "0" == false 

Salida:

1: true! 
0: false! 
Cuestiones relacionadas