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

时间:2017-10-16 09:04:46

标签: php

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

<?php
declare(strict_types = 1);

function testXml(string $xml) {
    echo "this is a string: " .$xml;
}

现在当我向这个函数提供一个对象时,我希望抛出一个Type Error。 但事实并非如此,SimpleXmlElement类型的对象以静默方式转换为字符串: https://3v4l.org/lQdaZ

这是一个错误还是一个功能?

3 个答案:

答案 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

Sandbox example