![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Здравствуйте, помогите пожалуйста с решением одной проблемы.
Пишу CMS со следующей системой маршрутизации: URL имеет вид http://site.ru/НАЗВАНИЕ_КОМПОНЕНТА/НАЗВАНИЕ_МЕТОДА/ПАРАМЕТР_МЕТОДА1/ПАРАМЕТР_МЕТОДА2/и т.д./ Роутер из URL вытаскивает НАЗВАНИЕ_КОМПОНЕНТА и подгружает его. Структура компонента:
Подгрузить компонент понятно как, но как вызвать метод компонента? Надеюсь понятно объяснил, что требуется. Заранее больше спасибо за советы и помощь. |
|||
|
||||
| StachelDraht |
|
|||
![]() Не Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 19.1.2006 Репутация: 1 Всего: 1 |
может быть проще использовать какой нибудь фрэймворк
|
|||
|
||||
| overmetallist |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 19.8.2010 Репутация: нет Всего: нет |
вот
$callback — это корректный callback-вызов PHP Yii-приложения состоят из компонентов–объектов, созданных согласно спецификациям. Компонент (component) — это экземпляр класса CComponent или производного от него. Использование компонента в основном включает доступ к его свойствам, а также вызов и обработку его событий. Базовый класс CComponent устанавливает то, как определяются свойства и события.
Это сообщение отредактировал(а) overmetallist - 23.8.2010, 17:57 |
||||
|
|||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Это не рабочий проект, пишу ради опыта. overmetallist, не уверен, что до конца понял :( Можно какой-нибудь пример на пальцах, пожалуйста. В любом случаи, большое спасибо. |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
посмотрите в сторону call_user_func() или чего-то аналогичного
|
|||
|
||||
| overmetallist |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 19.8.2010 Репутация: нет Всего: нет |
можно и так как предложил bars80080 :
вот еще намудрил:
Это сообщение отредактировал(а) overmetallist - 23.8.2010, 21:30 |
||||
|
|||||
| littlemook |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 24.8.2010 Репутация: нет Всего: нет |
Лучше call_user_func_array, удобней параметры подавать цельным массивом |
|||
|
||||
| ZneP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 15.7.2008 Где: Россия, Москва Репутация: нет Всего: нет |
Как-то так я бы сделал P.S. не тестил, поэтому за extract($Params) не ручаюсь |
|||
|
||||
| gta4kv |
|
||||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
Расскажу немножко о своем опыте в этом прискорбном деле.
Была в свое время такая же задача, реализовал я её с помощью ReflectionClass. Работало все примерно так:
И вот самый просто пример модуля с таким подходом
default_function забита в конфиге, "функция по-умолчанию". (в моем случае -- load). |
||||
|
|||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
bars80080, overmetallist, littlemook, ZneP, gta4kv, Большое спасибо!
|
|||
|
||||
| Just123 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Написал следующий метод:
Правда пока он не принимает аргументов функций. Подскажите пожалуйста: 1) Как проверить существует функция или нет?
В данном случаи, если функция не существует, появится ошибка: Warning: call_user_func(News::asd) [function.call-user-func]: First argument is expected to be a valid callback in D:\Web Server\Apache\htdocs\kernel\classes\Route.php on line 49 как избежать появления этой ошибки, без помощи @ ? 2) Как передать аргументы в функцию, если общее количество аргументов не известно? Это сообщение отредактировал(а) Just123 - 26.8.2010, 01:42 |
||||
|
|||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
(скромно намекает) советую испробовать мой вариант, или хотя бы просто заглянуть в код в предыдущем моём посте.
Это сообщение отредактировал(а) gta4kv - 26.8.2010, 01:44 |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
gta4kv, Я просто не хотел бы использовать по умолчанию отключенные расширения.
Это сообщение отредактировал(а) Just123 - 26.8.2010, 02:04 |
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
||||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
gta4kv, Извиняюсь, проглядел function_exists. Спасибо большое.
Добавлено через 7 минут и 21 секунду А как быть со вторым вопросом: Как передать аргументы в функцию, если общее количество аргументов не известно? |
|||
|
||||
| ZneP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 15.7.2008 Где: Россия, Москва Репутация: нет Всего: нет |
Проверено лично Если нужно, чтобы передавались значения с ключами, например: $first = 1, $str = "hello", $second = 2, .... то тогда лучше передавать ассоциативный массив Это сообщение отредактировал(а) ZneP - 26.8.2010, 09:03 |
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
Массив. |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
gta4kv, а как именно это сделать можно? С помощью call_user_func_array никак не получается передать массив...Вы не могли бы привести пример?
|
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
Зачем извращаться.
http://ru.php.net/manual/en/function.call-user-func.php
Добавлено @ 18:13 Код не тестировал. Это сообщение отредактировал(а) gta4kv - 26.8.2010, 18:16 |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
gta4kv, Спасибо большое
|
|||
|
||||
| Just123 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Я дико извиняюсь, что снова поднимаю эту тему, но мучает меня немного один вопрос.
Таким способом мы можем только передать массив содержащий все параметры, это немного не удобно. Нельзя никак передать 2, 3, n аргументов? т.е. сейчас функция должна иметь следующий вид:
Нельзя никак передать аргументы так, чтобы функция записывалась следующим образом:
? |
||||
|
|||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
Это не имеет смысла, если вам нужны «реальные» имена, то ассоциативный массив вам в помощь.
|
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
есть: func_get_args()
|
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
bars80080, поправьте меня, если я ошибаюсь, но с помощью функции func_get_args(), можно узнать лишь то, какие аргументы были переданы функции.
gta4kv, Почему это не имеет смысла? Ассоциативный массив тут не подойдёт т.е. названия ключей заранее не известны, они могут быть любыми. Это сообщение отредактировал(а) Just123 - 27.8.2010, 00:55 |
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
Какая реальная разница между записью $name[ 1 ] и $name1?
Добавлено через 2 минуты и 6 секунд
var_export() |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Никакой, но а если там будут к примеру $name, $sex, $mail, $age ? |
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
и что?
|
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
В смысле и что? Загвоздка как раз в этом, чтобы передать не массив $args, а переменные типа $name, $age и т.д. |
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 21 Всего: 91 |
||||
|
||||
| ZneP |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 15.7.2008 Где: Россия, Москва Репутация: нет Всего: нет |
И?
Где разница то? Если кол-во параметров не известно - используем ассоциативный массив. Если названия параметров не известны: foreach ($params as $key => $value) { // $key = name, $value = Маша // и тд } |
||||
|
|||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
я отвечал на вопрос: func_get_args отлично позволяет обрабатывать сколько-угодно аргументов. насчёт остального я даже боюсь читать, ибо не могу найти смысл |
|||
|
||||
| Shogun |
|
|||
|
сёгун-сан ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 8.6.2006 Где: Кишинёв Репутация: 9 Всего: 11 |
Это сообщение отредактировал(а) Shogun - 27.8.2010, 14:39 -------------------- 2b || !2b |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Я на некоторое время уезжал и не было возможности ни отписываться здесь, ни продолжать кодить, поэтому, если никто не против, я снова подниму данную тему.
Попытаюсь заново объяснить то, что требуется, на примере Code Igniter. CodeIgniter использует подход, основанный на сегментах адреса: www.your-site.com/news/article/my_article Сегменты в URL, соответствуют архитектуре Модель-Отображение-Контроллер и, как правило, строятся таким образом: www.your-site.com/class/function/arg В первом сегменте описывается контроллер class к которому происходит обращение. Во втором сегменте происходит ссылка на функцию function или метод, который необходимо вызвать. В третьем и последующих сегментах описываются переменные, которые будут переданы в эту функцию. В CI метод может выглядеть к примеру вот так:
В качестве аргументов передаются сегменты URL, ну а названиях переменных могут быть любыми и это будут именно переменные с осмысленными названиями, а не массивы. Как этого добиться? Ковыряюсь в CI, но толком никак понять не могу, каким образом они это реализовали. |
|||
|
||||
| Shogun |
|
|||
|
сёгун-сан ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 8.6.2006 Где: Кишинёв Репутация: 9 Всего: 11 |
Just123, в моем посте я именно такой метод и написал.
http://forum.vingrad.ru/index.php?showtopi...t&p=2203743 -------------------- 2b || !2b |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Shogun, Точно! Спасибо большое, я почему-то когда пробовал его в прошлый раз, он не захотел нормально работать, видимо я где-то что-то перепутал.
Спасибо вам большое, вы мне очень помогли. P.S. Я так понимаю, методы в таком случаи должны быть статическими? Т.к. если они не статические, то вылазиет ошибка: Strict Standards: Non-static method controller_class::controller_method() cannot be called statically in D:\Web Server\Apache\htdocs\test.php on line 18 Strict Standards: Non-static method controller_class::controller_method() cannot be called statically in D:\Web Server\Apache\htdocs\test.php on line 20 Strict Standards: Non-static method controller_class::controller_method() cannot be called statically in D:\Web Server\Apache\htdocs\test.php on line 20 |
|||
|
||||
| Shogun |
|
|||
|
сёгун-сан ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 8.6.2006 Где: Кишинёв Репутация: 9 Всего: 11 |
Just123, хммм да нет не обязательно, в примере же не статичный метод... а какая у вас версия пхп??
-------------------- 2b || !2b |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Shogun, Версия 5.3, скорее всего из-за этого и ошибки. В любом случаи, спасибо еще раз.
|
|||
|
||||
| Shogun |
|
|||
|
сёгун-сан ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 8.6.2006 Где: Кишинёв Репутация: 9 Всего: 11 |
Just123, не думаю что и за этого... я тестил на 5.2 и на 5.3.1 и все нормально... ;)
-------------------- 2b || !2b |
|||
|
||||
| Just123 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 9.12.2007 Где: localhost Репутация: нет Всего: нет |
Shogun, Очень странно, так как даже пример у меня выдает те же самые ошибки. Аномалия. ))
|
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |