Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recommended replacement for deprecated call_user_method?

Tags:

php

deprecated

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:

  • Is there a completely new technique for calling an object's methods by name?
  • Which is the fastest/best/official replacement?
  • What's the reason for deprecation?
like image 885
okoman Avatar asked Apr 23 '09 17:04

okoman


3 Answers

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() and call_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.

like image 135
Paolo Bergantino Avatar answered Nov 16 '22 18:11

Paolo Bergantino


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);
like image 18
Chad Birch Avatar answered Nov 16 '22 17:11

Chad Birch


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

like image 1
Daminux Avatar answered Nov 16 '22 17:11

Daminux