<?PHP
declare(strict_types = 1);
function testXml(string $xml) {
echo "this is a string: " .$xml;
}
现在当我向这个函数提供一个对象时,我希望抛出一个Type Error.
但事实并非如此,SimpleXmlElement类型的对象以静默方式转换为字符串:
https://3v4l.org/lQdaZ
解决方法:
正如magic function __toString()
的文档所述:
The
__toString()
method allows a class to decide how it will react when it is treated like a string.
因为类SimpleXmlElement
实现了__toString()
魔术方法,所以每次使用SimpleXmlElement时都会调用它(该方法),其中字符串是预期的.使用__toString()返回的值而不是对象.
很难说这是一个功能还是一个bug1.函数testXml()目前需要一个字符串作为参数,你不会因为它默默地接受一个SimpleXmlElement而感到高兴.
如果删除其参数的类型,则不再发生对__toString()的调用,并且函数内的$xml参数的值是SimpleXmlElement对象.对__toString()的调用发生在echo“this is a string:”.$xml;你可以打印$xml的值非常方便,即使它不是一个字符串.
如果您认为它是一个错误,那么echo
(希望字符串作为参数)应该抱怨$xml的类型,不应该打印它.不是那么方便,不是吗?
1这不是一个错误,这就是语言的演变过程. __toString()是在type declarations之前为标量类型引入的,为了不破坏现有行为,如果可能,则调用它而不是触发关于参数的错误类型的错误.