Подтвердить что ты не робот

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

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

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

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

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

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

Ответ 1

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

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

Ответ 3

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

Я использую что-то подобное в моем методе __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-й аргумент: метод вызова, Третий аргумент: params

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

method_exists()
class_exists()

Приветствия

Ответ 4

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

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

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

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