ReflectionClass приведен к «нормальному» классу - PullRequest
3 голосов
/ 13 июля 2010

У меня есть класс TableData с двумя магическими методами.Один - конструктор, а другой - метод __call.

Я реализовал вызов с помощью следующего кода:

$class = new ReflectionClass('TableData');
$class->newInstanceArgs($parArray);

Он отлично работает.Но теперь я хочу использовать мой магический метод.Поэтому я звоню $class->getData(), но это не работает.Я получаю сообщение об ошибке, что я вызвал неопределенный метод.
Я пытался использовать ReflectionMethod и вызывать, но он снова не работает.

Нет ли способа привести объект ReflectionClass в мой класс TableData?

Спасибо за совет!

Ответы [ 3 ]

9 голосов
/ 13 июля 2010

Вы не можете вызвать метод в экземпляре ReflectionClass.Вы должны вызвать метод для экземпляра вашего (отраженного) исходного класса.

$class    = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);
$instance->getData();
2 голосов
/ 13 июля 2010

Что сначала получить ReflectionClass:

class MyClass {
  public function __call($method, $args) {
    var_dump($method);
  }
}

$reflectionClass = new ReflectionClass('MyClass');

И затем создать экземпляр класса:

$class = $reflectionClass->newInstanceArgs();

Чтобы вызвать ваш метод для этого $class объекта:

$class->getData();

И вы получите ожидаемый результат:

string 'getData' (length=7)


т.е. вы должны вызывать ваши методы для того, что возвращает newInstanceArgs, а не для ReflectionClass сама.

0 голосов
/ 13 июля 2010

Интересно, зачем вы здесь вообще используете Reflection?Может быть, вам лучше изменить конструктор так, чтобы он принимал массив?

Причины, по которым не используется Reflection, - это медлительность и нечитаемость: это гораздо проще в использовании и понимании:

$instace = new TableData($parArray);

Чем это:

$class    = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);

Итак, если вы хотите, чтобы ваш конструктор обрабатывал массив как аргумент и список аргументов, вы можете использовать func_get_args:

class TableData {
    public function __constructor() {
        if (func_num_args() != 1 || !is_array($params = func_get_arg(0))) {
            $params = func_get_args();
        }

        // now the args are in $params either way
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...