Комментарии 18
имхо такой же костыль как и
только extract() проще
function foo(array $args) { extract($args); }
только extract() проще
да, но если надо вызвать в такой способ уже существующий код?
прав. да. я использовал ReflectionAPI для получения public функций кучи классов и это довольно медленная процедура.
а рефакторить нельзя в вашем случае так, чтобы получить именно массив на вход, а не отдельно каждый параметр?
а рефакторить нельзя в вашем случае так, чтобы получить именно массив на вход, а не отдельно каждый параметр?
в одних местах — возможно, в конкретно моем случае — нет.
еще одно распостраненное использование — движок лей-аутов в етом нисколько не ведомом продукте: для подключения внешних css и js файлов, та и для других целей в описании шаблона там используеться именно метод такого типа.
а для какой цели вам нужно было получать список public методов? get_class_methods() не подходил? или использовать php-tokenizer для разбора и обернуть его кешированием в файл типа
еще одно распостраненное использование — движок лей-аутов в етом нисколько не ведомом продукте: для подключения внешних css и js файлов, та и для других целей в описании шаблона там используеться именно метод такого типа.
а для какой цели вам нужно было получать список public методов? get_class_methods() не подходил? или использовать php-tokenizer для разбора и обернуть его кешированием в файл типа
<?php return array( ... );
?get_class_methods() даёт так же публичные методы родительских классов, а мне про них совсем не надо знать. tokenizer не пробовал, да и на выходе он давал бы слишком много лишних данных.
call_user_func_array()
список аргументов предварительно отлично сортируется и фильтруется по маске.
список аргументов предварительно отлично сортируется и фильтруется по маске.
в своем примере я показал как сделать ето только с использованием reflection. до написания тестов на производительность пока не доходили руки. вечером может как-то добавлю. вопросов с производительностю на момент написания не возникало. ето как раз тот случай, где она неважна.
Я в курсе как это сделать с рефлексией :)
Но для меня в варианте рефлексии многовато писать лишнего кода.
А с массивами как-то проще. array_intersec_key, array_multisort, call_user_func_array и вуаля.
Минус только в том, что таки необходимо иметь массив-маску хотя бы вида array(param_name1 => null, ...., param_name2 => null)
Но для меня в варианте рефлексии многовато писать лишнего кода.
А с массивами как-то проще. array_intersec_key, array_multisort, call_user_func_array и вуаля.
Минус только в том, что таки необходимо иметь массив-маску хотя бы вида array(param_name1 => null, ...., param_name2 => null)
Хорошая идея. Также перечень аргументов в сигнатуре лучше переносится в phpDoc
Это нововведение уже обсуждается в @internals для будущих версий PHP. С помощью Reflection можно получить нужный результат, но оправдано ли такое удобство с точки зрения производительности?
о, спасибо, за введение в @internals не знал.
а оправдано ли? все относительно: если таких вызовов немного — очень удобно и расширяемо, если их очень много (вродь как в Magento) — за производительность все прекрасно знаем (правда еще не вникал какой оверхед именно от етой возможности там). тоесть ету возможность не стоит пихать повсеместно, а только там, где даст много удобства в разработке и других полезных вещей.
а оправдано ли? все относительно: если таких вызовов немного — очень удобно и расширяемо, если их очень много (вродь как в Magento) — за производительность все прекрасно знаем (правда еще не вникал какой оверхед именно от етой возможности там). тоесть ету возможность не стоит пихать повсеместно, а только там, где даст много удобства в разработке и других полезных вещей.
wtf @internals?
добавил код в топик
Давно (года 3 точно) использую массивы в качестве параметров в функциях.
Описываю их так
тогда вызов без параметров не даст ошибку.
Описываю их так
function __name ($a = null) {}
тогда вызов без параметров не даст ошибку.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Передача аргументов функции по имени в PHP