2010-07-13 37 views
3

我有一个类的TableData与两个神奇的方法。一个是构造函数,另一个是__call方法。ReflectionClass投到“正常”类

我已经实现了与下面的代码的调用:

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

它工作的伟大。但现在我想用我的魔法。所以我打电话给$class->getData(),但它不起作用。我得到错误,我调用了一个未定义的方法。
我试图使用ReflectionMethod并调用,但它不再工作。

有没有办法将ReflectionClass对象投射到我的TableData类?

感谢您的咨询!

回答

9

您不能调用ReflectionClass实例上的方法。您必须在您的(反映的)原始类的实例上调用该方法。

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

什么baout首先得到ReflectionClass

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

$reflectionClass = new ReflectionClass('MyClass'); 

,然后,instanciating类:

$class = $reflectionClass->newInstanceArgs(); 

要打电话给你的方法$class对象:

$class->getData(); 

,你会得到预期的结果:

string 'getData' (length=7) 


即你有什么是newInstanceArgs返回,而不是在ReflectionClass本身来调用你的方法。

0

我想知道你为什么在这里使用反射。也许你最好想修改你的构造函数来接受一个数组?

理由不使用反射是缓慢和不可读性: 这是很容易理解和使用:

$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 
    } 
} 
+0

我用过,因为参数的数目不是相同的。 我有5个参数直到15个参数,所以我找到了更好的解决方案。 – CSchulz 2010-07-13 15:34:07