Pull to refresh

Comments 18

имхо такой же костыль как и

function foo(array $args)
{
  extract($args);
}


только extract() проще
да, но если надо вызвать в такой способ уже существующий код?
прав. да. я использовал ReflectionAPI для получения public функций кучи классов и это довольно медленная процедура.

а рефакторить нельзя в вашем случае так, чтобы получить именно массив на вход, а не отдельно каждый параметр?
в одних местах — возможно, в конкретно моем случае — нет.
еще одно распостраненное использование — движок лей-аутов в етом нисколько не ведомом продукте: для подключения внешних css и js файлов, та и для других целей в описании шаблона там используеться именно метод такого типа.

а для какой цели вам нужно было получать список public методов? get_class_methods() не подходил? или использовать php-tokenizer для разбора и обернуть его кешированием в файл типа <?php return array( ... );?
get_class_methods() даёт так же публичные методы родительских классов, а мне про них совсем не надо знать. tokenizer не пробовал, да и на выходе он давал бы слишком много лишних данных.
tokenizer скорее для анализа и генерации кода больше подходит. даже для генерации SOAP WSDL приходилось его как-то использовать.
call_user_func_array()
список аргументов предварительно отлично сортируется и фильтруется по маске.
в своем примере я показал как сделать ето только с использованием reflection. до написания тестов на производительность пока не доходили руки. вечером может как-то добавлю. вопросов с производительностю на момент написания не возникало. ето как раз тот случай, где она неважна.
Я в курсе как это сделать с рефлексией :)
Но для меня в варианте рефлексии многовато писать лишнего кода.

А с массивами как-то проще. array_intersec_key, array_multisort, call_user_func_array и вуаля.
Минус только в том, что таки необходимо иметь массив-маску хотя бы вида array(param_name1 => null, ...., param_name2 => null)
а здесь — не надо :)
Хорошая идея. Также перечень аргументов в сигнатуре лучше переносится в phpDoc
Это нововведение уже обсуждается в @internals для будущих версий PHP. С помощью Reflection можно получить нужный результат, но оправдано ли такое удобство с точки зрения производительности?
о, спасибо, за введение в @internals не знал.
а оправдано ли? все относительно: если таких вызовов немного — очень удобно и расширяемо, если их очень много (вродь как в Magento) — за производительность все прекрасно знаем (правда еще не вникал какой оверхед именно от етой возможности там). тоесть ету возможность не стоит пихать повсеместно, а только там, где даст много удобства в разработке и других полезных вещей.
Давно (года 3 точно) использую массивы в качестве параметров в функциях.
Описываю их так
function __name ($a = null) {}

тогда вызов без параметров не даст ошибку.
Sign up to leave a comment.

Articles