Рекомендуемая замена устаревшего метода call_user_method?

Поскольку PHP call_user_method() и call_user_method_array() отмечены устаревшими, мне интересно, какая альтернатива рекомендуется?

Одним из способов было бы использовать call_user_func() , потому что, передавая массив с объектом и именем метода, поскольку первый аргумент делает то же самое, что и устаревшие функции. Поскольку эта функция не отмечена устаревшей, я предполагаю, что причина не в их использовании в ООП-стильном стиле?

Другим способом, я могу думать, является использование Reflection API , который может быть наиболее удобной и ориентированной на будущее альтернативой. Тем не менее, это больше кода, и я могу представить, что он медленнее, чем использование упомянутых выше функций.

Что меня интересует:

  • Существует ли совершенно новая методика вызова методов объекта по имени?
  • Какая самая быстрая / лучшая / официальная замена?
  • В чем причина для устаревания?

Как вы сказали, call_user_func может легко дублировать поведение этой функции. В чем проблема?

Страница call_user_method даже перечисляет ее как альтернативу:

 <?php call_user_func(array($obj, $method_name), $parameter /* , ... */); call_user_func(array(&$obj, $method_name), $parameter /* , ... */); // PHP 4 ?> 

Что касается того, почему это было устаревшим, это сообщение объясняет это:

Это связано с тем, что функции call_user_method() и call_user_method_array() могут быть легко дублированы:

старый способ:
call_user_method($func, $obj, "method", "args", "go", "here");

новый путь:
call_user_func(array(&$obj, "method"), "method", "args", "go", "here");

Лично я бы, вероятно, пошел с предложением переменных переменных, опубликованным Чадом.

Вы можете сделать это с помощью переменных переменных , это выглядит самым чистым для меня. Вместо:

 call_user_func(array($obj, $method_name), $parameter); 

Вы делаете:

 $obj->{$method_name}($parameter); 

Сделайте что-нибудь подобное:

Я использую что-то подобное в моем методе __construct ().

 $params = array('a','b','c'); // PUT YOUR PARAMS IN $params DYNAMICALLY call_user_func_array(array($this, $this->_request), array($params)); 

1-й аргумент: экземпляр Obect, второй аргумент: метод для вызова, третий аргумент: params

Прежде чем вы сможете проверить, есть ли метод или класс, с помощью:

 method_exists() class_exists() 

ура

если вы получите следующую ошибку: Warning: call_user_func () ожидает, что параметр 1 будет действительным обратным вызовом, второй член массива не является допустимым методом в C: \ www \ file.php в строке X и код следующим образом:

 call_user_func(array($this, $method)); 

use (string) для имени метода $ method

 call_user_func(array($this, (string)$method));