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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...