[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: _call проблемы
3Dinterface
Нужно через call, вызвать метод с параметрами. Параметры приходят в массиве.



class component{

var $obj;

function component($my){
$this->obj=$my;
}


function __call($m, $a) {

$this->obj->$m($a);
// проблема в том что функция с именем в переменной $m похоже думает
// что ей передают в качестве параметра массив, в то время как это
//массив параметров. Как передать параметры, а не массив ?


}

}



инициализация класса component происходит внутри другого класса
$c=new component($this);

здесь конструтору передаётся в качестве текущий класс, но это не суть важно



Спустя 2 минуты, 19 секунд (21.10.2011 - 23:22) Игорь_Vasinsky написал(а):
у тя какой php? в 5 же подругому многое - http://irbis-team.com - там есть про ООП

может вообще через наследование можно(нужно)

Спустя 4 минуты, 16 секунд (21.10.2011 - 23:26) 3Dinterface написал(а):
Через наследование невозможно, класс component создаётся внутри того класса от которого он должен наследоваться. При этом класс уже инициализирован.

По результату, у класса component, и его производных должен быть доступ, к методам класса внутри которого создан экземпляр component, или экземпляры дочерних классов.

Понимаю что задача дикая, просто тот класс внутри которого создаётся components это стандартный класс cms'ки, если я его изменю, мои изменения будут унечтожены при первом обновлении. Да и вообще это хреновая идея, переписывать под себя классы ядра битрикса, вот и приходится извращаться.

другого способа кроме __call невижу.
Вопрос вызывать через переменную с именем функции, или всё таки через eval

Спустя 3 минуты, 49 секунд (21.10.2011 - 23:30) Игорь_Vasinsky написал(а):
по ссылке то почитай. обязательно

Цитата
Параметры приходят в массиве.


Цитата
роблема в том что функция с именем в переменной $m похоже думает
        // что ей передают в качестве параметра массив,


а ты проверь что она думает is_array()

Спустя 7 минут (21.10.2011 - 23:37) 3Dinterface написал(а):
код
print_r($a);
print_r(is_array($a));

результат
Array ( [0] => element ) 1

как видете это массив.

Спустя 4 минуты, 15 секунд (21.10.2011 - 23:41) Игорь_Vasinsky написал(а):
запутался..

Цитата
что ей передают в качестве параметра массив, в то время как это
        //массив параметров.


Ты передаёшь в функцию массив параметров
Функция воспринимает параметр-массив

так твоя функция не работает с массивом, или работает? может её покажешь?

Спустя 10 минут, 27 секунд (21.10.2011 - 23:51) 3Dinterface написал(а):
Их много и все разные. С массивом параметров точно некто не работает )


1) function InitComponentTemplate($templatePage = "", $siteTemplate = false, $customTemplatePath = ""){};

2) function ShowComponentTemplate(){};

3) function AddIncludeAreaIcon($arIcon){}

4) И ТД.

Ещё раз повторю, сами функции изменить невозможно.

Просто мне надо вместо массива с параметрами, вызвать функцию с параметрами которые содержаться в массиве. Вот собственно и всё.

Спустя 5 минут, 22 секунды (21.10.2011 - 23:57) Игорь_Vasinsky написал(а):
блин...

я о чём говорю - если функция не умеет работать с массивом в качестве аргумента - не давай ей массив

функция в цикле foreach , будет работать со всеми элементами массива

foreach($a as $value)
{
$i = 0; $i++;

$this->obj.$i->$m($a);
}

$arr = array();

for($i=0; $i<count($a))
{
//Забивай массив объектами
}




или мне спать уже надо идти?

Спустя 6 минут, 46 секунд (22.10.2011 - 00:04) 3Dinterface написал(а):
Помоему спать ))
Мне кажется вызываешь одну и ту же функцию в цикле и передаёшь те параметры которые надо было передать разом, по одному )))



у тебя получается ))

InitComponentTemplate("одна переменная");
InitComponentTemplate("вторая переменная);
InitComponentTemplate("третья переменна");

а надо
function InitComponentTemplate("первая", "вторая","третья")

Спустя 3 минуты, 13 секунд (22.10.2011 - 00:07) Игорь_Vasinsky написал(а):
тыж говоришь то функция не работает с массивом?

как ты сможешь передать массив, если должен передать его элементы разом - без "распаковки массива", его нужно в цикле разобрать


тут речь уже не ООП, это массивы

Спустя 1 минута, 50 секунд (22.10.2011 - 00:09) 3Dinterface написал(а):
Я надеялся, что эта ситуацию уже предусмотрена.
К примеру есть call_user_method_array(имя функции, массив параметров), но он с классами похоже не дружит.

Как вариант, наверно разобрать массив, и собрать в строку.
А вот что со строкой делать я без болды, через eval наверное применять.


Спустя 5 минут, 59 секунд (22.10.2011 - 00:15) 3Dinterface написал(а):
ХАХА)).
И не зря надеялся

Формат функции
call_user_func_array(array(КЛАСС, "ИМЯ функции"), массив параметров);

рабочий пример
call_user_func_array(array($this->self, "IncludeComponentTemplate"), $a);

спасибо за беседу )

Спустя 2 минуты, 55 секунд (22.10.2011 - 00:18) Игорь_Vasinsky написал(а):
да не зачто... как то странно побеседовали..

Спустя 39 секунд (22.10.2011 - 00:18) Игорь_Vasinsky написал(а):
ещё через create_function наверно можно было.

Спустя 36 минут, 9 секунд (22.10.2011 - 00:54) Игорь_Vasinsky написал(а):
лжеэксперт - это группа. охеренная группа с умными парнями.

Спустя 3 минуты, 50 секунд (22.10.2011 - 00:58) Invis1ble написал(а):
Цитата
лжеэксперт - это группа. охеренная группа с умными парнями.

к сожалению, я пока что увидел только одну интересную статью от вашей группы (а точнее от vital) - про Comet.

Спустя 5 минут, 16 секунд (22.10.2011 - 01:03) Winston написал(а):
Цитата (Invis1ble @ 22.10.2011 - 00:58)
(а точнее от vital)

От vital smile.gif

Спустя (22.10.2011 - 01:01) Invis1ble написал(а):
[стыд]Блин, точно![/стыд]
Поправил

Спустя 7 минут, 33 секунды (22.10.2011 - 01:09) Игорь_Vasinsky написал(а):
статьи то для новичков, а не для твоего уровня.

Спустя 5 минут, 54 секунды (22.10.2011 - 01:15) Invis1ble написал(а):
ну дай мне хоть пару ссылок на статьи для новичков, может я проглядел smile.gif

Спустя 5 минут, 11 секунд (22.10.2011 - 01:20) Игорь_Vasinsky написал(а):
все мои вроде.. + POST GET
Быстрый ответ:

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