有没有办法查看一个对象是否专门实现了 ->__toString?这似乎不起作用:
method_exists($object, '__toString');
有两种方法可以检查。
假设您有课程:
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
反射很慢,我认为这是使用它们的最糟糕的解决方案。
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
你一定在其他地方做错了什么,因为这是有效的:
class Test {
function __toString() {
return 'Test';
}
}
$test = new Test();
echo method_exists($test, '__toString');
在 PHP 8 中出现了一个新的接口 Stringable。
Stringable
接口可用于键入提示任何实现__toString()
的对象。此外,每当一个类实现__toString()
时,它都会在幕后自动实现接口,无需手动实现
class Foo
{
public function __toString(): string
{
return 'foo';
}
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');
参考:来源