Поскольку 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));