I have a class TableData with two magic methods. One is the constructor and the other is the __call method.
I have realized the invoke with following code:
$class = new R开发者_JAVA百科eflectionClass('TableData');
$class->newInstanceArgs($parArray);
It work great. But now I want to use my magic method. So I call $class->getData(), but it doesn't work. I get the error, that I called an undefined method.
Is there no way to cast the ReflectionClass Object to my TableData class?
Thanks for advice!
You can't call the method on the instance of ReflectionClass. You have to call the method on the instance of your (reflected) original class.
$class = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);
$instance->getData();
What about first getting the ReflectionClass :
class MyClass {
public function __call($method, $args) {
var_dump($method);
}
}
$reflectionClass = new ReflectionClass('MyClass');
And, then, instanciating the class :
$class = $reflectionClass->newInstanceArgs();
To call your method on that $class object :
$class->getData();
And you'll get the expected result :
string 'getData' (length=7)
i.e. you have to call your methods on what is returned by `newInstanceArgs`, and not on the `ReflectionClass` itself.
I wonder why you are using Reflection here at all. Maybe you better want to modify your constructor to accept an array?
Reasons not to use Reflection are slowness and unreadability: This is much easier to use and understand:
$instace = new TableData($parArray);
Than this:
$class = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);
So, if you want your constructor to handle both an array as argument and a list of arguments, you can use 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
}
}
加载中,请稍侯......
精彩评论