val operadores logicos is_true false ejemplo bool php class object evaluation

php - operadores - Evaluar objeto a un booleano



operadores logicos php (6)

Considera lo siguiente:

class MyClass { private $var1 = "apple"; private $var2 = "orange"; } $obj = new MyClass(); if($obj) { // do this } else { // do that }

PHP evalúa mi objeto a verdadero porque 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 lo trate como un booleano?


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

Esto es incorrecto. PHP en realidad 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 hacer que PHP evalúe una variable como falsa si contiene una referencia a un objeto. Primero deberías asignar uno de los siguientes a la variable:

null array() "" false 0


Lo mejor que puedes 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


Lo siento por llegar tarde, pero jugué con una tarea similar y he hecho algún tipo de truco / solución. Observe el patrón "$object" que llama __toString 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!


No, no puedes. Desafortunadamente, la conversión booleana en php no es modificable, y un objeto siempre devolverá verdadero cuando se convierta en un booleano.

Ya que claramente tiene alguna lógica que quiere colocar en esa declaración de control, ¿por qué no define un método en su objeto (por ejemplo, "isValid ()") que verifica las condiciones que desea verificar y luego reemplaza:

if ($obj)

con:

if ($obj->isValid())


Puede usar una pequeña extensión para php7: https://github.com/p1ncet/obcast . Como puede ver en la descripción, permite convertir un objeto en booleano implementando una nueva interfaz interna Boolable:

$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);

salida:

bool(false) bool(true)


Puedes hacerlo así: (bool) $ yourObject

será