我有一个函数,它期望一个字符串作为输入参数:
<?php
declare(strict_types = 1);
function testXml(string $xml) {
echo "this is a string: " .$xml;
}
Run Code Online (Sandbox Code Playgroud)
现在当我向这个函数提供一个对象时,我希望抛出一个Type Error.但事实并非如此,SimpleXmlElement类型的对象被静默转换为字符串:https: //3v4l.org/lQdaZ
这是一个错误还是一个功能?
正如魔术函数 的文档__toString()解释:
该
__toString()方法允许类决定在将其视为字符串时它将如何反应.
因为该类SimpleXmlElement实现了__toString()魔术方法,所以每次SimpleXmlElement使用a 时,都会调用它(该方法).使用返回的值__toString()而不是对象.
很难说这是一个功能还是一个错误1.该函数testXml()当前需要一个字符串作为参数,你不会因为它默默接受一个字符串而感到高兴SimpleXmlElement.
如果删除其参数的类型,则调用__toString()不再发生,$xml函数内的参数值是SimpleXmlElement对象.调用__toString()发生echo "this is a string: " .$xml;在行中,$xml即使它不是字符串,也可以打印值非常方便.
如果你认为它是一个bug,那么echo(希望字符串作为参数)应该抱怨它的类型$xml而不应该打印它.不是那么方便,不是吗?
1这不是一个错误,这就是语言的演变过程.__toString()在标量类型的类型声明之前引入,并且为了不破坏现有行为,如果可能,则调用它而不是触发关于参数的不正确类型的错误.
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |