如何在PHP中检查对象是否实现 - > __ toString()?

时间:2011-05-07 00:09:05

标签: php string object

无论如何都要查看对象是否具体实现 - > __ toString?这似乎不起作用:

method_exists($object, '__toString');

5 个答案:

答案 0 :(得分:10)

有两种方法可以检查它。

让我们假设您有课程:

class Foo
{
    public function __toString()
    {
        return 'foobar';
    }
}

class Bar
{
}

然后你可以做任何一个:

$rc = new ReflectionClass('Foo');       
var_dump($rc->hasMethod('__toString'));

$rc = new ReflectionClass('Bar');       
var_dump($rc->hasMethod('__toString'));

或使用:

$fo = new Foo;
var_dump( method_exists($fo , '__toString'));
$ba = new Bar;
var_dump( method_exists($ba , '__toString'));

区别在于,在第一种情况下,课程实际实例化 您可以在此处查看演示:http://codepad.viper-7.com/B0EjOK

答案 1 :(得分:3)

答案 2 :(得分:3)

我必须在其他地方做错事,因为这有效:

class Test {

function __toString() {
    return 'Test';
}

}

$test = new Test();

echo method_exists($test, '__toString');

答案 3 :(得分:3)

反思很慢,我认为这是使用它们的最糟糕的解决方案。

bool method_exists ( mixed $object , string $method_name )

object - 对象实例或类名(http://php.net/manual/en/function.method-exists.php

无需创建对象来检查方法是否存在。

method_exists('foo', '__toString')

interface StringInterface{
   public function __toString() :string;
}


class Foo implement StringInterface {...}

->>(new MyClass) instanceof StringInterface

答案 4 :(得分:0)

在PHP 8中,出现了一个新的Stringable接口。
Stringable接口可以用来提示任何字符串或实现__toString()的内容。此外,每当一个类实现__toString()时,它都会自动实现幕后接口,而无需手动实现

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}

function bar(Stringable $stringable) { /* … */ }

bar(new Foo());
bar('abc');

ref:source