哪些PHP函數在傳遞對象時調用對象__toString方法?哪些PHP函數使用__toString
看看下面的例子:
class url {
protected $url;
function __construct($url) {
$this->setUrl($url);
}
public function setUrl($url) {
$this->url = $url;
}
public function getUrl() {
return $this->url;
}
public function __toString() {
return $this->getUrl();
}
}
$url = new url('http://example.com');
var_dump(in_array($url,array('http://example.com')));
通話時傳遞的URL對象in_array計算結果爲True。
下面也評估爲真,但它在內部做什麼,是比較兩個對象還是兩個字符串?
var_dump(in_array($url,array($url)));
明確說應該比較字符串會更好嗎?
var_dump(in_array((string)$url,array('http://example.com')));
做一些類似in_array看到一個對象,如果它有一個__toString方法或字符串的所有PHP函數是它只是其中的一部分?因此,在傳遞一個對象之前明確地說(字符串)會更好嗎?
測試==比較的示例。
$url = new url('http://example.com');
$url2 = new url('http://example.com');
var_dump(in_array($url,array('http://example.com'))); #1
var_dump(in_array($url,array($url))); #2
var_dump(in_array($url,array($url2))); #3
關於PDO和閉包對象,這些實現在C中並且暴露給PHP *,就像它們是*對象一樣,但實際上並不共享用PHP類定義的所有對象的邏輯。我想你可以把它們想象成不是從一個PHP'class'的相同基礎繼承。 – IMSoP
感謝@IMSoP的澄清。 – Kryten
__toString()轉換必須基於上下文來完成,否則其他#1在比較之前未調用__toString()時不會返回true。 它似乎在引擎蓋下使用==,因爲#3返回true,即使__toString()方法使用rand()返回不同的值。 – lookbadgers