2010-07-13 45 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