哪些PHP函数使用__toString

时间:2014-04-24 14:37:49

标签: php standards 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。

以下也评估为true,但它在内部做了什么,是比较两个对象还是两个字符串?

var_dump(in_array($url,array($url)));

明确说明字符串应该进行比较会更好吗?

var_dump(in_array((string)$url,array('http://example.com')));

与in_array类似的所有PHP函数是否将对象视为字符串,如果它具有__toString方法或者只是其中的一部分?因此,在传递对象之前明确说出(string)会更好吗?

测试示例==比较。

$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 个答案:

答案 0 :(得分:1)

来自documentation

  

使用比较运算符(==)时,会以简单的方式比较对象变量,即:如果两个对象实例具有相同的属性和值,则它们是相同的,并且是同一类的实例。

     

当使用标识运算符(===)时,当且仅当它们引用同一类的同一实例时,对象变量才相同。

因此,在回答有关in_array的问题时,似乎使用比较运算符(==)比较了两个对象。在比较之前,没有转换为字符串(通过__toString()或任何其他方式)。

更一般地说,我发现几乎 PHP中的所有对象都是这种情况 - 唯一的例外是封装系统资源的类,如PDO或类似闭包的对象(用于我不完全理解的原因。)

在进行比较之前,没有必要将对象强制转换为字符串。