Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов пользовательского метода 
V
    Опции темы
bars80080
Дата 29.9.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



вечер, уже не соображаю

есть такая функция: 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'}()?
PM MAIL WWW   Вверх
sTa1kEr
Дата 29.9.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Код

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

PM MAIL   Вверх
bars80080
Дата 29.9.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



а почему $this? мне бы любого объекта
PM MAIL WWW   Вверх
sTa1kEr
Дата 29.9.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



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

Ну это для примера только. Конечно-же можно любой объект подставить.
PM MAIL   Вверх
bars80080
Дата 29.9.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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" } 
имя объекта и имя метода
PM MAIL WWW   Вверх
sTa1kEr
Дата 29.9.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(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));

PM MAIL   Вверх
bars80080
Дата 29.9.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата

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; результат такой (см.выше)
PM MAIL WWW   Вверх
sTa1kEr
Дата 29.9.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(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));

PM MAIL   Вверх
bars80080
Дата 29.9.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



вот так просто не выходило:

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

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

завтра попробуем $$objname
PM MAIL WWW   Вверх
youri
Дата 29.9.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



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

что мешает? тебе надо передать call_user_func_array объект, а не его имя
PM   Вверх
icewind
Дата 29.9.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 11.4.2009
Где: Ростов-на-Дону

Репутация: 20
Всего: 20



bars80080, какая версия php?
Вариант sTa1kEr должен работать. В call_user_func_array нужно передать валидный callback

Код

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


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


--------------------
user posted image
PM MAIL Skype   Вверх
MoLeX
Дата 30.9.2009, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



рнр 4 скорей всего у барса. сомневаюсь что он будет так работать


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
bars80080
Дата 30.9.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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);



наверное, надо будет выносить инклуд страниц из внутренностей класса, хотя честно говоря, не очень бы хотелось
PM MAIL WWW   Вверх
sTa1kEr
Дата 30.9.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



 smile Жесть!
PM MAIL   Вверх
bars80080
Дата 30.9.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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

что именно?
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1002 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.