Since PHP's call_user_method()
and call_user_method_array()
are marked deprecated I'm wondering what alternative is recommended?
One way would be to use call_user_func()
, because by giving an array with an object and a method name as the first argument does the same like the deprecated functions. Since this function is not marked deprecated I assume the reason isn't the non-OOP-stylish usage of them?
The other way I can think of is using the Reflection API, which might be the most comfortable and future-oriented alternative. Nevertheless it's more code and I could image that it's slower than using the functions mentioned above.
What I'm interested in:
As you said call_user_func
can easily duplicate the behavior of this function. What's the problem?
The call_user_method
page even lists it as the alternative:
<?php
call_user_func(array($obj, $method_name), $parameter /* , ... */);
call_user_func(array(&$obj, $method_name), $parameter /* , ... */); // PHP 4
?>
As far as to why this was deprecated, this posting explains it:
This is because the
call_user_method()
andcall_user_method_array()
functions can easily be duplicated by:old way:
call_user_method($func, $obj, "method", "args", "go", "here");
new way:
call_user_func(array(&$obj, "method"), "method", "args", "go", "here");
Personally, I'd probably go with the variable variables suggestion posted by Chad.
You could do it using variable variables, this looks the cleanest to me. Instead of:
call_user_func(array($obj, $method_name), $parameter);
You do:
$obj->{$method_name}($parameter);
Do something like that :
I use something like that in my __construct() method.
$params = array('a','b','c'); // PUT YOUR PARAMS IN $params DYNAMICALLY
call_user_func_array(array($this, $this->_request), array($params));
1st argument : Obect instance, 2nd argument : method to call, 3rd argument : params
Before you can test if method or Class too, with :
method_exists()
class_exists()
Cheers
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With