我有一个函数,它需要一个字符串作为输入参数:
<?php
declare(strict_types = 1);
function testXml(string $xml) {
echo "this is a string: " .$xml;
}
现在当我向这个函数提供一个对象时,我希望抛出一个Type Error。 但事实并非如此,SimpleXmlElement类型的对象以静默方式转换为字符串: https://3v4l.org/lQdaZ
这是一个错误还是一个功能?
答案 0 :(得分:5)
正如magic function __toString()
的文档所述:
__toString()
方法允许类决定当它被视为字符串时它将如何反应。
因为类SimpleXmlElement
实现了__toString()
魔术方法,所以每次使用SimpleXmlElement
时,都会调用它(该方法)。使用__toString()
返回的值代替对象。
很难判断这是一个功能还是一个错误 1 。函数testXml()
当前需要一个字符串作为参数,你不会因为它默默地接受SimpleXmlElement
而感到高兴。
如果删除其参数的类型,则不再调用__toString()
,函数内的$xml
参数值为SimpleXmlElement
对象。对__toString()
的调用发生在echo "this is a string: " .$xml;
行,即使它不是字符串,您也可以打印$xml
的值非常方便。
如果您认为它是一个错误,那么echo
(希望字符串作为参数)应该抱怨$xml
的类型而不应该打印它。不是那么方便,不是吗?
1 这不是一个错误,这就是语言的演变过程。在type declarations之前为标量类型引入了__toString()
,并且为了不破坏现有行为,如果可能,则调用它而不是触发关于参数的错误类型的错误。
答案 1 :(得分:1)
那是因为您正在将字符串($simpleXml
)而不是SimpleXmlElement($xml
)传递给函数。
答案 2 :(得分:0)
这是一个php正在调用的功能 - 如果已定义 - 对象的__toString
- 魔术方法:
此代码需要php @ 7:
<?php
class ClassImplementingToString
{
public function __toString()
{
return "hello world";
}
}
function foo(string $foo)
{
echo $foo;
}
foo(new ClassImplementingToString());
将输出:hello world