2014-04-24 57 views
0

哪些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 

回答

1

documentation

當使用比較運算符(==),對象變量以簡單的方式進行比較,即:兩個對象實例是相等的,如果它們具有相同的屬性和值,並且是同一類的實例。

當使用身份運算符(===)時,當且僅當它們引用同一個類的同一實例時,對象變量纔是相同的。

因此,在回答關於in_array的問題時,看起來兩個對象使用比較運算符(==)進行比較。比較前沒有轉換爲字符串(通過__toString()或任何其他方式)。

更一般地,我發現這是在PHP幾乎所有對象的情況 - 唯一的例外是封裝系統資源類,像PDO或對象,如關閉(原因我不完全理解)。

在進行比較之前,沒有必要將對象轉換爲字符串。

+1

關於PDO和閉包對象,這些實現在C中並且暴露給PHP *,就像它們是*對象一樣,但實際上並不共享用PHP類定義的所有對象的邏輯。我想你可以把它們想象成不是從一個PHP'class'的相同基礎繼承。 – IMSoP

+0

感謝@IMSoP的澄清。 – Kryten

+0

__toString()轉換必須基於上下文來完成,否則其他#1在比較之前未調用__toString()時不會返回true。 它似乎在引擎蓋下使用==,因爲#3返回true,即使__toString()方法使用rand()返回不同的值。 – lookbadgers

相關問題