我有一个函数,期望将字符串作为输入参数:
<?php
declare(strict_types = 1);
function testXml(string $xml) {
echo "this is a string: " .$xml;
}
现在,当我向该函数提供一个对象时,我希望引发类型错误。但是事实并非如此,SimpleXmlElement类型的对象被静默转换为字符串:https : //3v4l.org/lQdaZ
这是错误还是功能?
如magic函数 的文档所述__toString()
:
该
__toString()
方法允许类决定将其视为字符串时的反应。
因为该类SimpleXmlElement
实现了__toString()
magic方法,所以每次SimpleXmlElement
在需要字符串的地方使用a时都会调用该方法。使用返回的值__toString()
代替对象。
很难判断这是功能还是错误1。该函数testXml()
当前需要一个字符串作为参数,而您却不满意它会静默地接受a的事实SimpleXmlElement
。
如果删除其参数的类型,将__toString()
不再发生对的调用,并且$xml
函数内参数的值为SimpleXmlElement
对象。调用__toString()
发生在该echo "this is a string: " .$xml;
行中,$xml
即使它不是字符串,也可以打印出它的值,这非常方便。
如果您认为这是一个错误,则echo
(希望将字符串作为参数)应该抱怨的类型,$xml
而不应该打印它。不是很方便,不是吗?
1这不是错误,这是语言的演变方式。__toString()
是在标量类型的类型声明之前引入的,并且为了不破坏现有行为,在可能的情况下调用它,而不是触发有关参数类型错误的错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句