Неопределенная ошибка метода в ReflectionClass, но метод существует

1

В настоящее время я использую phpunit для некоторого модульного тестирования. Из-за наличия некоторых защищенных методов мне пришлось использовать Reflection Class для изменения видимости этих методов для public.

Первоначальные методы были вызваны успешно, но каким-то образом он застревает по определенному методу:

Fatal error: Call to undefined method ReflectionClass::create_schema()in
/vagrant/fuelphp/fuel/app/tests/model/repository/jobpost.php on line 54

Однако сброс метода через get_method() с помощью var_dump доказывает, что он существует в экземпляре класса:

class ReflectionMethod#2317 (2) {
  public $name =>
  string(13) 'create_schema'
  public $class =>
  string(34) 'Model_Repository_Feed'
}

Тогда реальный путаный бит, я решил использовать hasMethod() чтобы узнать, существует ли метод:

 52     echo "If this says 1, class exists: ".$this->_target->hasMethod('create_schema');
 53     try {
 54         $this->_target->create_schema();
 55     }

Результат при запуске говорит: "Да, это существует... но это не так":

If this says 1, class exists: 1
Fatal error: Call to undefined method ReflectionClass::create_schema() in /vagrant/fuelphp/fuel/app/tests/model/repository/jobpost.php on line 54

Чтобы прояснить этот метод является общедоступным и наследуется от abstract родительского класса:

public function create_schema() {
    $this->create_schema_exec(self::$_real_schema_name);
  }

Как решить эту проблему?

  • 0
    является динамическим методом, он может существовать в экземпляре класса, но есть ли он в фактическом классе. php.net/manual/en/class.reflectionobject.php можно использовать на экземпляре, загруженном во время выполнения (я сомневаюсь, что это так), это будет похоже на __call (), но это просто мысль из-за абстрактного наследования.
  • 0
    Спасибо за ваш ответ. Он наследуется от своего родительского класса, а последний блок кода от самого родительского класса. Просто использовал getParentClass() и он показывает правильный родительский класс
Показать ещё 4 комментария
Теги:
reflection

1 ответ

1
Лучший ответ

вам нужно получить объект класса, который содержит метод не объект отражения.

$reflection = new ReflectionClass($className);
$object = $reflection->newInstanceWithoutConstructor();
$object->methodName();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню