| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Хитрый синтаксис |
| Автор: BSCheshir 21.11.2012, 16:01 | ||
подскажите, есть ли методы, позволяющие реализовать такое поведение для произвольного числа параметров
где f2 может быть любой функцией (т.е. внутрь для решения задачи не лазим) |
| Автор: Sanchezzz 21.11.2012, 16:35 | ||
| Не совсем ясно что вы хотите.. Вы хотите реализовать выполнение в F1 произвольную функцию через параметр? Это называется анонимные функции в 5.3+
для создания функций с переменным количеством N Аргументов есть функция func_get_args() В 5.3 версии есть приятные изменения которых раньше не было |
| Автор: BSCheshir 21.11.2012, 17:13 | ||||||||||||||
нет, я хочу передать функции набор параметров, который предоставлен в массиве
и спрашиваю: есть ли методы, позволяющие реализовать такое поведение для произвольного числа параметров? чтобы понятнее - существует ли какой-нить такой синтаксис:
или
Называется - задай правильно вопрос - получишь в нём ответ
вот. это, теоретически, оно
Так, а теперь осталось вспомнить, что надо не функцию вызвать, а создать экземпляр класса
|
| Автор: Aliance 21.11.2012, 17:39 |
| http://php.net/manual/ru/function.extract.php? |
| Автор: BSCheshir 21.11.2012, 17:48 | ||||||||||
Нет, не extract
что-то наподобие такого должно по идее быть о. или этого. http://www.php.net/manual/ru/reflectionmethod.invokeargs.php You can't call the constructor of $class like this:
That's no http://ua2.php.net/callback as first parameter. Let's pick this apart:
Is the same as
|
| Автор: Fortop 21.11.2012, 23:52 | ||
|
| Автор: Sanchezzz 22.11.2012, 08:13 |
| Мне такое чувство что вы пытаетесь создать второй Underscore.php |
| Автор: ksnk 22.11.2012, 09:33 | ||
http://ru2.php.net/manual/en/reflectionclass.newinstanceargs.php
откуда-то из недр php.net |
| Автор: BSCheshir 22.11.2012, 11:37 | ||||
| ksnk, вот он - метод моей мечты Есть некоторые ограничения, но... Оно в итоге получилось чуть сложнее
Sanchezzz, ну разве что в этой части
|
| Автор: Fortop 22.11.2012, 19:56 |
| BSCheshir, вы можете привести вменяемый пример использования этого конструкта? |
| Автор: BSCheshir 23.11.2012, 11:24 | ||
Fortop, ещё и вменяемый? Он же и так красивый, зачем вменяемый? Ну, щас попробуем изобразить
|
| Автор: Fortop 23.11.2012, 21:19 |
Ну я не увидел смысла в этой фабрике. Красоты соответственно. |
| Автор: ksnk 24.11.2012, 10:19 |
| Fortop, Какая разница? Вызвать конструктор объекта с определенным числом параметров, или функцию объекта, с тем-же числом параметров, предварительно вызвав его конструктор без параметров. Во втором случае нам нужен специфический класс, который позволит с собой так поступить, а в первом - любой. В каком месте более некрасиво? |
| Автор: ksnk 25.11.2012, 09:54 |
| Присмотрелся, наконец, к коду BSCheshir, и тоже не понял смысла Fortop, Мои рассуждения касались другого случая. Решается задача создания объекта по имени и известному набору параметров. Если пользоваться ReflectionClass, ее можно решить для любых классов(первый случай). Если не пользоваться - только для специально под это заточенных( второй). |
| Автор: Fortop 25.11.2012, 23:01 | ||
Все верно, только я вот сходу плохо могу придумать в каком месте в пхп такая гибкость может потребоваться, возможно просто из-за недостатка опыта в каких-то областях. А так, как фишка - да. |
| Автор: BSCheshir 26.11.2012, 13:51 | ||
| ksnk, Fortop, спасибо за критику, конечно, но 1.
2. В примере хотел показать создание коллекции экземпляров, для "пакетной" обработки, если что. Что конкретно не красиво? |
| Автор: Fortop 27.11.2012, 00:09 | ||
Отсутствие смысла. Код ведь красив не сам по себе.
Вот смотри, мы же коллекцию объектов всегда используем в каком-то конкретном месте, и крайне редко это такая высокая абстракция, которая не знает ничего об интерфейсе объектов, кроме того, что у них есть конструктор. Добавив интерфейс установки параметров скопом, или же задав возможность конструктора класса получать параметры массивом. Ты сделаешь код более читаемым при той же функциональности. |
| Автор: BSCheshir 27.11.2012, 11:16 | ||||
т.е. с твоей точки зрения более красиво то же самое так записать?
Или каждый раз при создани каждого следующего экземпляра каждого класса (даже не фабрикой) нужно писать
|
| Автор: Fortop 27.11.2012, 12:13 | ||||||
Я выше пример давал
Но ты невнимательно прочел про параметры массивом
Поскольку в коллекции у тебя чаще всего однотипные же объекты, число параметров у которых не отличается и принцип работы с которыми одинаков. Все индивидуальности с лихвой покрываются таким
Я потому и попросил вменяемый пример, где твой код можно использовать. Потому что не вижу каких-либо удобств от него. |
| Автор: BSCheshir 27.11.2012, 15:06 | ||||
| То что не возражаю по всем пунктам - может значить не только то, что невнимательно читаю, но и то, что согласен;) Но раз уж зашел разговор о параметрах в массиве. Все отлично, даже более - можно ассоциативным массивом передавать -
Вопрос в том, что не подходит в применении к уже существующим классам, которые написаны без учёта того, что будет передаватся массив. Или, например, у одного передаётся ассоциативный массив первым параметром, у другого - список аргументов, у третьего - допустим, пусть будет массив из примера.
|
| Автор: baldina 27.11.2012, 16:49 |
| BSCheshir, остался основной вопрос: зачем всё это нужно? вы изобрели вариант http://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8, однако полезность его не очевидна, а в проектах (фреймворках), где DI интенсивно эксплуатируется, есть свои решения, не самые плохие. |
| Автор: Fortop 27.11.2012, 22:16 | ||
Понятное дело что не подходит. Я не знаю сколько там у вас легаси кода, но на мой личный взгляд проще привести к общим интерфейсам, да и полезнее в будущем. |
| Автор: ksnk 27.11.2012, 22:47 |
| Fortop, Одно из применений - инициализация классов из файла конфигурации. К примеру, класс mail, отсылающий сообщения, может быть стандартным mail'ом, SMTP транспортом "через mail-ru-google-com", skype и icq мессенджером и так далее. Инициализация каждого из них требует разных параметров, однако интерфейс всех классов сведен к фабричному mail'у. Параметры инициализации нужного транспорта - ассоциативный массив с параметрами в конфиге. С точки зрения юзера - нужно только выбрать нужный транспорт по названию. Вполне, на мой взгляд, кошерная схема. |
| Автор: Fortop 28.11.2012, 11:06 | ||||
Причем чужих классов транспорта С разнородными сигнатурами. И нужно это в недрах фреймворка где-то глубоко.
Жаль не нагуглю быстро статью. Там обсуждался вопрос выноса программируемых свойств сущностей в конфиги. Например, тот же Zend_Form может полностью задаваться в конфигурационном файле. Но как справедливо говорилось в статье, мы этим просто подменяем программирование в коде, на программирование в конфиге и зачастую не меньшим объемом, но другим синтаксисом... |
| Автор: baldina 28.11.2012, 11:31 |
| спор о dependency injection сродни религиозному |
| Автор: Fortop 28.11.2012, 12:19 | ||
Лично мне Di удобен в таком варианте
Так что спора особо не вижу. P.S. как один из вариантов http://phemto.sourceforge.net/quick-start.php |
| Автор: BSCheshir 28.11.2012, 13:54 |
| Fortop, т.е. всё-таки удобнее передавать параметры инициализации в конструктор, да? Или тут от предмета дискуссии зависит? ;) |
| Автор: Fortop 28.11.2012, 14:13 | ||||
Вот так удобнее
|
| Автор: xoptov 1.5.2013, 15:02 | ||||
Это не синтакис хитрый, это ты программист никакой... |