传递对象时,哪些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
答案 0 :(得分:1)
使用比较运算符(==)时,会以简单的方式比较对象变量,即:如果两个对象实例具有相同的属性和值,则它们是相同的,并且是同一类的实例。
当使用标识运算符(===)时,当且仅当它们引用同一类的同一实例时,对象变量才相同。
因此,在回答有关in_array
的问题时,似乎使用比较运算符(==
)比较了两个对象。在比较之前,没有转换为字符串(通过__toString()
或任何其他方式)。
更一般地说,我发现几乎 PHP中的所有对象都是这种情况 - 唯一的例外是封装系统资源的类,如PDO
或类似闭包的对象(用于我不完全理解的原因。)
在进行比较之前,没有必要将对象强制转换为字符串。