微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP 7严格类型对象到字符串转换

我有一个函数,它期望一个字符串作为输入参数:

<?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之前为标量类型引入的,为了不破坏现有行为,如果可能,则调用它而不是触发关于参数的错误类型的错误.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐