[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Предача переменных из массива в метод
moskitos80
Всем здрасте. Есть динамически формируемый, индексный массив, каждый раз с разным количеством элементов.

Вопрос: как эти элементы передать методу или функции в виде именно переменных (по-фигу с какими именами - главное значение) причём в том порядке, в котором они идут в массиве?

Я знаю, что можно не париться и просто передать массив в метод, но нужно, что бы именно в виде переменных.
Кто знает решение вопроса?



Спустя 8 минут, 2 секунды (3.12.2010 - 13:06) linker написал(а):
moskitos80
Передавай массивом, ибо внутри метода тебе все равно работать придется с массивом через func_get_args() т.к. ты сам сказал что количество может быть переменным.

Спустя 6 минут, 28 секунд (3.12.2010 - 13:12) moskitos80 написал(а):
Да нет. Каждый метод принимает фиксированное число аргументов.

Массив тот формирует роутер, из строки запроса.
Вот получается, что роутер формирует массив - первые сколько то элементов это путь к контроллерам (тоже каждый раз разный) и собсно файл контроллера, а то что осталось нужно передать как аргументы (это "то что осталось" и получается динамически формируемый массив), причём контроллер точно знает, какое кол-во аргументов ему придёт. Вот я и думаю, как передать именно переменные, не охота в каждом контроллере дублировать код обработки массива, ибо дублирование кода не есть хорошо.

Спустя 24 минуты, 25 секунд (3.12.2010 - 13:37) sergeiss написал(а):
Я не совсем понял, что ты хочешь сделать и почему не хочешь использовать массивы...

Можно так сделать (если максимальное количество аргументов известно):
function test_function( $arg1='', $arg2='', $arg3='', $arg4='')
{
...
}

Тут мы объявляем фунцию с 4-мя именованными аргументами. И при этом задаём им значения по умолчанию, т.е. если они не будут указаны.
В данном случае правильным будет вызов функции с любым количеством параметров от 0 до 4. В коде анализируй, что ты получил, и делай что-то. Но только это будет тоже какая-то обработка данных :) С массивом будет, как минимум, нагляднее.

PS. Можно использовать функции func_num_args(), func_get_arg() и func_get_args() для получения массива переданных аргументов... Но это будет, опять же, работа с массивом, от которой ты хочешь уйти :)

Спустя 3 минуты, 29 секунд (3.12.2010 - 13:40) linker написал(а):
Пример массива в студию, очень странно что массив целочисленный, а не ассоциативный ибо параметры запросов в адресной строке таки имеют названия и их надо бы сохранять.

Спустя 50 минут, 15 секунд (3.12.2010 - 14:30) moskitos80 написал(а):
Строки запроса у меня будут примерно такие: xxx://site.doman/catalog/category/material/45
И то не факт, это будет зависеть от установленных компонентов системы.

Запрсы обрабатывает htaccess:


addDefaultCharset UTF-8
RewriteEngine on
RewriteCond $1 !^(index\.php|robots\.txt|images|js)
RewriteRule ^(.*)$ /index.php?/$1 [L]


так что фактически

$_SERVER['QUERY_STRING'] // содержит: /catalog/category/material/45/2


где /catalog/category/ - это путь. material это файл material.php,
содержащий класс Мaterial. Все что после - параметры для конструктора.

Но строка выше - это просто пример. Она может содержать совершенно неопределённое
кол-во сегментов, т.е. уровень вложенности файла контроллера material может быть каким угодно
(А не как у CodeIgniter, блин - он глубже второй папки вложенности ни хрена не видит!)


  
public static function parseUri()
{
//Переменная будет "накапливать" путь к файлу:
$path = '';

//Будет содержать массив из "разбитой" строки запроса:
$uri_items = NULL;

//Разбиваем строку запроса:
$uri_items = explode('/',ltrim($_SERVER['QUERY_STRING'],'/'));

// Теперь пройдёмся по каждому элементу:
for($i=0; $i<sizeof($uri_items); $i++)
{
//Если элемент пустой закругляемся нафиг:
if(empty($uri_items[$i]))return $path;

//Если элемент есть "файл"...
if(file_exists($path.$uri_items[$i].EXT))
{
//Подключаем его, добавив возможно накопленный путь в переменной "$path"
require_once($path.$uri_items[$i].EXT);

//Проверяем есть ли класс с именем = имени файла, но с заглавной буквы...
// У меня условие: класс должен обзываться как и файл, но с большой буквы.

if(class_exists(ucfirst($uri_items[$i])))
{
$className = ucfirst($uri_items[$i]);

//Получаем остаток массива - это уже должны быть аргументы для конструктора подключаемого класса,
//Конструктор класса ждёт именно такие, именно в таком кол-ве, именно в таком порядке:
//Сколько их будет система изначально не знает!
//Потому как подключаемые классы - это модули для расширения системы
//Которые будут писаться в будущем.

$items = array_slice($uri_items,$i+1);

.....
//Здесь нужно что то сделать с $items... Возможно что то вроде: extract(array_slice($uri_items,$i+1),EXTR_PREFIX_ALL,'cl_var')
// Но extract возвращает только кол-во извлечённых элементов, поэтому это:
//
// return new $className(extract(array_slice($uri_items,$i+1),EXTR_PREFIX_ALL,'cl_var')); -- не канает.


return new$className( /* Сюды надо передать переменные! */);
}

}

else if(is_dir($path.$uri_items[$i]))
{
$path .= $uri_items[$i].'/';
}
}


return $path;
}


Метод должен возвращать анонимный объект, конструктору которого были переданы, ожидаемые им параметры. Т.е. подключать контроллер.

Спустя 8 минут, 53 секунды (3.12.2010 - 14:39) linker написал(а):
Я конечно не шибко шарю в mod_rewrite, но что-то мне подсказывает, что правило в .htaccess нуждается в переписывании. Дабы получить нормальный ассоциативный массив.

Абсолютную динамичность и унифицированность сделать тут не получится (может и получится, но стоить это будет дороговато в плане читабельности и ресурсов), а потому так или иначе необходимо выработать какое-нибудь правило для роутеров, контроллеров и прочего.

Спустя 33 минуты, 54 секунды (3.12.2010 - 15:13) moskitos80 написал(а):
linker - Спасибо. Попробую копать в этом направлении, а то знаете, как бывает - зациклишься на одном, а решение совсем в другом месте. smile.gif


_____________
Сложное - просто. Простое сложно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.