Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > вызов пользовательского метода


Автор: bars80080 29.9.2009, 17:37
вечер, уже не соображаю

есть такая функция: call_user_func_array
через неё мы можем вызвать как функцию: 

Код

call_user_func_array('myfunc', array(arg1, arg2, ...))


так и метод класса: 

Код

call_user_func_array(array('classname','methodname'), array(arg1, arg2, ...))


но, судя по всему, когда мы вызываем метод, он вызывается по типу classname::methodname, а в этом случае методу не доступны любые свойства класса, которые в методе прописаны как $this->property

во всяком случае ругается: Fatal error: Using $this when not in object context in ...

что в принципе понятно, это ведь не объект и содержимого у него нет.

тогда вопрос: как вызвать метод именно объекта, а не класса?
я же не могу написать call_user_func_array('obj->methodname', array(arg1, arg2, ...))
не записывается же оно так ${'objname'}->{'methodname'}()?

Автор: sTa1kEr 29.9.2009, 17:40
Код

call_user_func_array(array($this,'methodname'), array(arg1, arg2));

Автор: bars80080 29.9.2009, 17:47
а почему $this? мне бы любого объекта

Автор: sTa1kEr 29.9.2009, 17:47
Цитата(bars80080 @  29.9.2009,  18:47 Найти цитируемый пост)
а почему $this? мне бы любого объекта 

Ну это для примера только. Конечно-же можно любой объект подставить.

Автор: bars80080 29.9.2009, 17:50
call_user_func_array(array('objname','methodname'), array(arg1, arg2)); ?


что-то я пробовал, либо прохлопал, либо не получалось. щас посмотрим

Добавлено через 2 минуты и 7 секунд
Цитата

Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'RB::getGraficAccess' was given in 

какая-то такая хрень вылазит

Добавлено через 5 минут и 2 секунды
первый параметр функции:
array(2) { [0]=> string(2) "RB" [1]=> string(15) "getGraficAccess" } 
имя объекта и имя метода

Автор: sTa1kEr 29.9.2009, 17:58
Цитата(bars80080 @  29.9.2009,  18:50 Найти цитируемый пост)
call_user_func_array(array('objname','methodname'), array(arg1, arg2)); ?

Да нет же. Если оба элемента строки - то будет вызван статический метод класса. Если первый элемент объект, то будет вызван метод этого объекта.
Код

call_user_func_array(array($objname, 'methodname'), array(arg1, arg2));

Автор: bars80080 29.9.2009, 18:02
Цитата

array(2) { [0]=> NULL [1]=> string(15) "getGraficAccess" } 
Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'Array' was given in 


это я call_user_func_array(array(${'objname'}, 'methodname'))

я не могу вписать именно $objname, вызов call_user_func_array происходит в другом классе, могу только передать имя объекта и имя метода

Добавлено через 39 секунд
сделал global $RB; результат такой (см.выше)

Автор: sTa1kEr 29.9.2009, 18:19
Цитата(bars80080 @  29.9.2009,  19:02 Найти цитируемый пост)
я не могу вписать именно $objname, вызов call_user_func_array происходит в другом классе, могу только передать имя объекта и имя метода

Значит тебе нужно каким-либо образом передать сам объект, по другому никак.

И вообще, что-то я не понимаю, как ты собрался вызывать метод объекта, который не существует в текущем контексте?

Добавлено через 38 секунд
Цитата(bars80080 @  29.9.2009,  19:02 Найти цитируемый пост)
сделал global $RB; результат такой (см.выше) 

У тебя в первом элементе массива NULL, а должен быть объект, метод которого ты пытаешься вызвать.

Добавлено через 1 минуту и 53 секунды
Если у тебя $objname содержит имя локальной переменной, которая содержит нужный тебе объект, тогда так
Код

call_user_func_array(array($$objname, 'methodname'), array(arg1, arg2));

Автор: bars80080 29.9.2009, 19:20
вот так просто не выходило:

call_user_func_array(array(${$ar[$i]}, 'methodname'), array(arg1, arg2));

где $ar[$i] - имя объекта

завтра попробуем $$objname

Автор: youri 29.9.2009, 19:42
Цитата(bars80080 @  29.9.2009,  18:02 Найти цитируемый пост)
я не могу вписать именно $objname, вызов call_user_func_array происходит в другом классе, могу только передать имя объекта и имя метода

что мешает? тебе надо передать call_user_func_array объект, а не его имя

Автор: icewind 29.9.2009, 20:48
bars80080, какая версия php?
Вариант sTa1kEr должен работать. В call_user_func_array нужно передать http://ru2.php.net/manual/en/language.pseudo-types.php#language.types.callback

Код

$foo = new foo();
call_user_func_array(array($foo, "bar"), array("three", "four"));


Должно работать. У меня на php 5.3 заработало

Автор: MoLeX 30.9.2009, 05:28
рнр 4 скорей всего у барса. сомневаюсь что он будет так работать

Автор: bars80080 30.9.2009, 09:42
5.2.6 у меня, а в доках написано, что функция должна работать с 4.0.6




всё, допёр, не происходило передачи объекта, функция сама нормально

а не происходило, потому что была кривизна во взаимоотношении классов.

фишка какая: первый класс, который занимался строительством страницы, подключал в себя запрашиваему страницу. в ней находится второй класс, который пользуется методом первого класса, в котором прописана call_user_func_array

решилось тем, что в странице со вторым классом перед $RB = new secondclass(); прописал global $RB;
а в первом классе

Код

global ${$fields[$j][3][$k][2]};
$ag3 = array(${$fields[$j][3][$k][2]}, $fields[$j][3][$k][3]);
$ag1[$k] = call_user_func_array($ag3, $ag2);



наверное, надо будет выносить инклуд страниц из внутренностей класса, хотя честно говоря, не очень бы хотелось

Автор: sTa1kEr 30.9.2009, 09:47
 smile Жесть!

Автор: bars80080 30.9.2009, 10:18
Цитата(sTa1kEr @  30.9.2009,  09:47 Найти цитируемый пост)
Жесть! 

что именно?

Автор: sTa1kEr 30.9.2009, 10:39
Конструкции вроде "global ${$fields[$j][3][$k][2]}". Переменные переменные и глобальные переменные сами по себе источники ошибок и неразберихи в коде, но глобальные переменные переменных...
Кстати, имхо, чуть-чуть более читабельной была бы конструкция:
Код

$obj = $GLOBALS[ $fields[$j][3][$k][2] ];
$ag3 = array($obj, ...);

Автор: bars80080 30.9.2009, 13:56
да, знаю. надо будет поразмыслить над этим попозжей

Автор: youri 30.9.2009, 15:43
Цитата(bars80080 @  30.9.2009,  09:42 Найти цитируемый пост)
решилось тем, что в странице со вторым классом перед $RB = new secondclass(); прописал global $RB;

используешь глобальное пространство имен для передачи информации? Почему бы не воспользоваться стандартным средством: параметрами функций/методов?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)