如何检查 PHP 中的对象是否实现了 ->__toString() ?

发布于 2024-11-05 07:09:02 字数 119 浏览 0 评论 0原文

无论如何,有没有办法查看一个对象是否专门实现了 ->__toString?这似乎不起作用:

method_exists($object, '__toString');

Is there anyway to see if an object specifically implements ->__toString? This doesn't seem to work:

method_exists($object, '__toString');

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

随波逐流 2024-11-12 07:09:02

有两种方法可以检查它。

假设您有类:

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

There are two way to check it.

Lets assume you have classes:

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

class Bar
{
}

Then you can do either:

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

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

or use:

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

Difference is that in first case the class is not actually instantiated.
You can look at demo here : http://codepad.viper-7.com/B0EjOK

命比纸薄 2024-11-12 07:09:02

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

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

Reflections is slow, and I think it's the worst solution to use them.

bool method_exists ( mixed $object , string $method_name )

object - An object instance or a class name (http://php.net/manual/en/function.method-exists.php)

There is no need to create an object to checking for existence of a method.

method_exists('foo', '__toString')

or

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


class Foo implement StringInterface {...}

->>(new MyClass) instanceof StringInterface
爱情眠于流年 2024-11-12 07:09:02

您一定在其他地方做错了什么,因为这是有效的:

class Test {

function __toString() {
    return 'Test';
}

}

$test = new Test();

echo method_exists($test, '__toString');

You must be doing something wrong somewhere else, because this works:

class Test {

function __toString() {
    return 'Test';
}

}

$test = new Test();

echo method_exists($test, '__toString');
送君千里 2024-11-12 07:09:02

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

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

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

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

参考:来源

In PHP 8 a new interface Stringable appears.
The Stringable interface can be used to type hint anything that is a string or implements __toString(). Furthermore, whenever a class implements __toString(), it automatically implements the interface behind the scenes and there's no need to manually implement it

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

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

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

ref:source

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文