Ответ 1
Проверьте, соответствует ли класс объявления классу объекта:
$reflector = new \ReflectionMethod($ob, 'createTable');
$isProto = ($reflector->getDeclaringClass()->getName() !== get_class($ob));
Можно ли проверить, был ли метод переопределен дочерним классом в 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
.
Проверьте, соответствует ли класс объявления классу объекта:
$reflector = new \ReflectionMethod($ob, 'createTable');
$isProto = ($reflector->getDeclaringClass()->getName() !== get_class($ob));
Чтобы получить эту информацию, вы должны использовать ReflectionClass. Вы можете попробовать getMethod и проверить имя класса метода.
$class = new ReflectionClass($this);
$method = $class->getMethod("yourMethod");
if ($method->class == 'classname') {
//.. do something
}
Но имейте в виду, что отражение не очень быстро, поэтому будьте осторожны с использованием.