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á