Подтвердить что ты не робот

Проверка php, если метод переопределен в дочернем классе

Можно ли проверить, был ли метод переопределен дочерним классом в PHP?

<!-- language: lang-php -->

class foo {
    protected $url;
    protected $name;
    protected $id;

    var $baz;

    function __construct($name, $id, $url) {
        $this->name = $name;
        $this->id = $id;
        $this->url = $url;
    }

    function createTable($data) {
        // do default actions
    }
}

Класс ребенка:

class bar extends foo {
    public $goo;

    public function createTable($data) {
        // different code here
    }
}

При повторении массива объектов, определенных как члены этого класса, как я могу проверить, какой из объектов имеет новый метод, а не старый? Существует ли такая функция, как method_overridden(mixed $object, string $method name)?

foreach ($objects as $ob) {
    if (method_overridden($ob, "createTable")) {
        // stuff that should only happen if this method is overridden
    }
    $ob->createTable($dataset);
}

Я знаю шаблон шаблона , но позвольте сказать, что я хочу, чтобы управление программой было отделено от класса и самих методов. Для этого мне понадобится функция method_overridden.

4b9b3361

Ответ 1

Проверьте, соответствует ли класс объявления классу объекта:

$reflector = new \ReflectionMethod($ob, 'createTable');
$isProto = ($reflector->getDeclaringClass()->getName() !== get_class($ob));

Ответ 2

Чтобы получить эту информацию, вы должны использовать ReflectionClass. Вы можете попробовать getMethod и проверить имя класса метода.

$class = new ReflectionClass($this);
$method = $class->getMethod("yourMethod");
if ($method->class == 'classname') {
    //.. do something
}

Но имейте в виду, что отражение не очень быстро, поэтому будьте осторожны с использованием.