Как проверить, реализует ли объект → __ toString() в PHP? Есть ли в любом случае, чтобы узнать, реализует ли объект специально → __ toString? Это не работает: method_exists($object, '__toString'); Ответ 1 Есть два способа проверить это. Предположим, что у вас есть классы: 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 Ответ 2 Я должен делать что-то неправильно в другом месте, потому что это работает: class Test { function __toString() { return 'Test'; } } $test = new Test(); echo method_exists($test, '__toString'); Ответ 3 Вы должны иметь возможность использовать отражение: http://www.php.net/manual/en/reflectionclass.hasmethod.php Ответ 4 Отражения медленные, и я думаю, что это худшее решение для их использования. 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
Ответ 1 Есть два способа проверить это. Предположим, что у вас есть классы: 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
Ответ 2 Я должен делать что-то неправильно в другом месте, потому что это работает: class Test { function __toString() { return 'Test'; } } $test = new Test(); echo method_exists($test, '__toString');
Ответ 3 Вы должны иметь возможность использовать отражение: http://www.php.net/manual/en/reflectionclass.hasmethod.php
Ответ 4 Отражения медленные, и я думаю, что это худшее решение для их использования. 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