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

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

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

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

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

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

person okoman    schedule 23.04.2009    source источник


Ответы (4)


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

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

person Paolo Bergantino    schedule 23.04.2009
comment
Похоже, что уведомление об устаревании в документации PHP на call_user_method должно указать вам на call_user_func. Жаль, что это не так, и мне нужно искать ТАК ответ ... = D - person Aaron; 06.01.2013

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

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

Ты сделаешь:

$obj->{$method_name}($parameter);
person Chad Birch    schedule 23.04.2009
comment
Проблема в том, что вы не знаете, какая функция будет вызвана, и если у нее есть параметр, сколько у нее параметров и т. Д. Я использую AMFPHP для связи через Flex и PHP, и я создаю шлюз. Вызывающий абонент, который не позволит мне вызывать PHP из Flex более одного раза за раз. Мне нужно будет создать экземпляры и вызвать более одного метода, и я понятия не имею, предоставит ли Flex параметры, и если да, то они будут в заданном массиве. - person Marco Aurélio Deleu; 08.06.2012

Сделайте что-нибудь вроде этого:

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

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

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

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

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

method_exists()
class_exists()

Ваше здоровье

person Daminux    schedule 30.12.2012

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

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

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

call_user_func(array($this, (string)$method));
person HausO    schedule 20.05.2013