Рекомендуемая замена для устаревшего call_user_method? - PullRequest
23 голосов
/ 23 апреля 2009

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

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

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

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

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

Ответы [ 4 ]

26 голосов
/ 23 апреля 2009

Как вы сказали 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");

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

17 голосов
/ 23 апреля 2009

Вы можете сделать это, используя переменные переменные , мне это кажется наиболее чистым. Вместо:

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

Вы делаете:

$obj->{$method_name}($parameter);
1 голос
/ 30 декабря 2012

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

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

$params = array('a','b','c'); // PUT YOUR PARAMS IN $params DYNAMICALLY

call_user_func_array(array($this, $this->_request), array($params));

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

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

method_exists()
class_exists()

Приветствия

0 голосов
/ 20 мая 2013

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

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

использовать (строковое) объявление для $ method name

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