Вычислить объект в булево

Рассмотрим следующее:

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

PHP оценивает мой объект как истинный, поскольку он имеет переменные-члены. Может ли эта логика быть переопределена каким-то образом? Другими словами, могу ли я контролировать то, что будет оценивать объект моего класса, когда он рассматривается как логический?

Related of "Вычислить объект в булево"

PHP оценивает мой объект как истинный, поскольку он имеет переменные-члены.

Это неверно. PHP фактически оценивает $obj как true потому что он содержит объект. Это не имеет никакого отношения к содержимому объекта. Вы можете проверить это, удалив участников из определения вашего класса, не будет иметь никакого значения, в какой ветви if / else выбрано.

Невозможно заставить PHP оценивать переменную как false, если она содержит ссылку на объект. Сначала вам нужно назначить одну из следующих переменных:

 null array() "" false 0 

Лучшее, что вы можете сделать, это использовать __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 

Нет, ты не можешь. К сожалению, boolean casting в php не модифицируется, и объект всегда возвращает true при преобразовании в логическое.

Поскольку у вас явно есть какая-то логика, которую вы хотите разместить в этом контрольном заявлении, почему бы не определить метод на вашем объекте (например, «isValid ()»), который проверяет условия, которые вы хотите проверить, а затем заменить:

 if ($obj) 

с:

 if ($obj->isValid()) 

Вы можете использовать небольшое расширение для php7: https://github.com/p1ncet/obcast . Как вы можете видеть из описания, он позволяет отличать объект от boolean путем внедрения нового внутреннего интерфейса 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); 

вывод:

 bool(false) bool(true) 

Извините за опоздание, но я просто играл с подобной задачей и сделал какой-то взлом / обходной путь. Обратите внимание "$object" шаблон "$object" , который вызывает __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 

Вывод:

 1: true! 0: false! 

Вы можете сделать это так: (bool) $ yourObject

будем