Как проверить, реализует ли объект → __ 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