2011-04-06 128 views
18

考慮以下幾點:評估對象爲布爾

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

$obj = new MyClass(); 

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

PHP評估我的對象爲真,因爲它有成員變量。不知怎的,這個邏輯能否被覆蓋?換句話說,當我的類的對象作爲布爾值對待時,我可以控制什麼樣的對象會被評估爲什麼?

+0

沒有,作爲然而,我們只能控制它串鑄造。 – Wrikken 2011-04-06 21:00:39

+0

爲什麼你需要有這種不尋常的行爲? – 2011-04-06 21:04:44

+1

您可以實現的最好方法是'if($ obj())'或'if(「$ obj」)'或者'if(count($ obj))'代替布爾評估。 – mario 2011-04-06 21:12:07

回答

16

PHP將我的對象評估爲true,因爲它具有成員變量。

這是不正確的。 PHP實際上將$obj評估爲true,因爲它包含一個對象。它與對象的內容無關。您可以通過從您的類定義中刪除成員來驗證這一點,但是在選擇if/else的哪個分支時不會產生任何影響。

如果PHP持有對某個對象的引用,則無法將其評估爲false。您必須首先將以下變量之一指定給變量:

null 
array() 
"" 
false 
0 
+2

是的。爲了澄清OP,'$ obj'不是對象。相反,它是對象位置的一個*引用,由PHP用來查找實際對象開始的內存中的點。 – AgentConundrum 2011-04-06 21:10:05

6

不,您不能。不幸的是,在PHP中進行布爾轉換是不可修改的,並且一個對象在轉換爲布爾值時總是返回true。

既然你顯然有一些邏輯,你的意思是在控制語句的地方,爲什麼不是你的對象上定義一個方法(說「的isValid()」),檢查要檢查,然後更換條件:

if ($obj) 

有:

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

是的,我想這是我必須做的,但我只是想簡化編碼。 – 2011-04-07 17:05:43

15

你能做的最好是使用__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

你能做到這樣的: (布爾)$ yourObject

2

您可以使用PHP7小擴展:https://github.com/p1ncet/obcast。正如你可以從描述看,它允許投的目的是通過實施新的內部接口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) 
+1

奇怪,爲什麼這不是一個內置函數。由於自PHP 5.2以來有'__toString()'的存在,我期望有這樣的一個 – 2017-04-18 13:28:34

0

對不起,我來晚了,但我只是用類似打任務,並做出了某種黑客/解決方法。通知"$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!