Рассмотрим следующее:
class MyClass { private $var1 = "apple"; private $var2 = "orange"; } $obj = new MyClass(); if($obj) { // do this } else { // do that }
PHP оценивает мой объект как истинный, поскольку он имеет переменные-члены. Может ли эта логика быть переопределена каким-то образом? Другими словами, могу ли я контролировать то, что будет оценивать объект моего класса, когда он рассматривается как логический?
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
будем