Рекомендуемая замена устаревшего метода call_user_method?
Поскольку PHP call_user_method()
и call_user_method_array()
отмечены устаревшими, мне интересно, какая альтернатива рекомендуется?
Одним из способов было бы использовать call_user_func()
, потому что, передавая массив с объектом и именем метода в качестве первого аргумента, такие же, как устаревшие функции. Поскольку эта функция не отмечена устаревшей, я предполагаю, что причина заключается не в их не-ООП-стильном использовании?
Другим способом, о котором я могу думать, является использование Reflection API, который может быть наиболее удобной и ориентированной на будущее альтернативой. Тем не менее, это больше кода, и я мог бы заметить, что он медленнее, чем использование упомянутых выше функций.
Что меня интересует:
- Существует ли совершенно новая методика вызова методов объекта по имени?
- Какая самая быстрая/лучшая/официальная замена?
- В чем причина устаревания?
Ответы
Ответ 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");
Лично я бы, вероятно, пошел с предложением переменных переменных, отправленным Чадом.
Ответ 2
Вы можете сделать это с помощью переменных переменных, это выглядит самым чистым для меня. Вместо:
call_user_func(array($obj, $method_name), $parameter);
Вы делаете:
$obj->{$method_name}($parameter);
Ответ 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));