Как проверить, реализует ли объект -> __ toString () в PHP? - PullRequest
17 голосов
/ 07 мая 2011

Есть ли в любом случае, чтобы увидеть, если объект специально реализует -> __ toString?Это не похоже на работу:

method_exists($object, '__toString');

Ответы [ 4 ]

11 голосов
/ 07 мая 2011

Есть два способа проверить это.

Предположим, у вас есть классы:

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

4 голосов
/ 06 апреля 2016

Отражения медленные, и я думаю, что это худшее решение для их использования.

bool method_exists ( mixed $object , string $method_name )

объект - экземпляр объекта или имя класса (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
3 голосов
/ 07 мая 2011

Должно быть, я что-то делаю не так, потому что это работает:

class Test {

function __toString() {
    return 'Test';
}

}

$test = new Test();

echo method_exists($test, '__toString');
3 голосов
/ 07 мая 2011

Вы должны быть в состоянии использовать отражение: http://www.php.net/manual/en/reflectionclass.hasmethod.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...