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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача объекта в функцию. 
:(
    Опции темы
Mal Hack
Дата 5.2.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Вот такой сабж. Имеем метод класса на вы полнении.
В этом методе вызывается сторонная функция abc().
В этой функции надо обратиться к другому методу объекта из которого она была вызвана.
Понятное дело, что $this как параметр передать нельзя.

Включать функцию в сам класс несколько не хотелось бы.

Есть ли какие-ть варианты?
PM ICQ   Вверх
IvanB
Дата 7.2.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Извините, если неправильно понял вопрос.

Самое очевидное (и пока единственное), что в голову пришло.
Код

class Class_1
{
 function Class_1()
 {
 }
 
 public function func_1($aaaa)
 {
  res($aaaa);
 }
 
 public function func_2($bbbb)
 {
  echo $bbbb;
 }
}

function res($text)
{
 $text.=$text;
 $obj=new Class_1();
 $obj->func_2($text);
 unset($obj);
}

$obj_main=new Class_1();
$obj_main->func_1(" text ");


--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
smartov
Дата 7.2.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



Mal Hack
Цитата(Mal Hack @ 5.2.2006, 22:41 Найти цитируемый пост)

Понятное дело, что $this как параметр передать нельзя.


smile Почему?
Мы с моим другом php посовещались, и решили что можно smile только в виде ссылки чтобы все было ок

Код

class TestClass
{

    var $parameter1;

    function TestClass($newValue)
    {
        $this->parameter1 = $newValue;
    }

    function subMethod1()
    {
        abc($this);
    }
    
    function subMethod2()
    {
        echo 'Submethod called from external function returned: <b>'.$this->parameter1.'</b>';
    }

}

function abc(&$class)
{
    $class->subMethod2();
}

$c = new TestClass('Value of parameter1 set by the class call');
$c->subMethod1();

PM MAIL   Вверх
Mal Hack
Дата 7.2.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



IvanB создание еще одного объекта отменяется.


Как-то про ссылку я забыл...
Имеем (в методе класса):
Код
     $obj = $this;
     
     $code = ( function_exists( "hl_do_before" ) ) ? hl_do_before( $code ) : $code; 
     $code = preg_replace_callback( $hl_pattern ,  create_function( '$argv' , "global \$obj; return hl_do_" . $type . "( \$argv , &\$obj );" ) , $code );


Функция, которую надо вызвать:
Код
   function hl_do_PHP( $argv , &$obj )


Как бы мне это грамотно в create_function записать...
PM ICQ   Вверх
smartov
Дата 7.2.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



Mal Hack
Цитата(Mal Hack @ 7.2.2006, 13:08 Найти цитируемый пост)

Функция, которую надо вызвать:

В смысле вызвать. Ты же вроде создаешь функцию. Ты иммешь ввиду создать функцию "function hl_do_PHP( $argv , &$obj )" с помощью create_function?

Ну я на твоем примере приводить не буду. Чтобы не запутать. Но тогда если мой изменить, то будет так:
Код

<?

class TestClass
    
{
    
    var $parameter1;
    
    function TestClass($newValue)
    {
        $this->parameter1 = $newValue;
    }

    function subMethod1()
    {
        $abc = create_function('&$object, $string', '$object->subMethod2($string); return false;');
        $abc($this, 'a runtime string');
    }
    
    function subMethod2($string)
    {
        echo 'Submethod called from external function returned: <b>'.$this->parameter1.'</b> and get $string param = '.$string;
    }

}
    
$c = new TestClass('Value of parameter1 set by the class call');
$c->subMethod1();

?>

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


Мудрый...
****


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

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



В методе класса есть вызов preg_replace_callback, callback функцией должна быть "function hl_do_PHP", объявленная вне класса.
preg_replace_callback передает ей один параметр - то, что она нашла в регулярке. А мне надо в этой функции еще и указатель на this получить, поэтому чтобы передать два параметра создаю create_function
PM ICQ   Вверх
smartov
Дата 8.2.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



Mal Hack
Цитата(Mal Hack @ 7.2.2006, 18:45 Найти цитируемый пост)
В методе класса есть вызов preg_replace_callback, callback функцией должна быть "function hl_do_PHP", объявленная вне класса.

Месье знает толк в извращениях. smile

Ну тогда грамотнее некуда. callback функция заточена под 1 параметр с этим ничего не сделать. global - единственный выход.
Ну это конечно если "по-умному".

А если по намешу (читай "по-сельски" smile ) то можно и preg_match_all а потом foreach-ем по match-ам пробежаться.

Это сообщение отредактировал(а) smartov - 8.2.2006, 00:37
PM MAIL   Вверх
Mal Hack
Дата 8.2.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(smartov @ 8.2.2006, 00:10 Найти цитируемый пост)

Ну тогда грамотнее некуда. callback функция заточена под 1 параметр с этим ничего не сделать. global - единственный выход.
Ну это конечно если "по-умному".

Пробовал, не получается.
Цитата(smartov @ 8.2.2006, 00:10 Найти цитируемый пост)

А если по намешу (читай "по-сельски" smile ) то можно и preg_match_all а потом foreach-ем по match-ам пробежаться.

Это нагрузку создаает, к сожалению.

PM ICQ   Вверх
smartov
Дата 8.2.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



Mal Hack

А у меня работает.

Код

<?

class TestClass
    
{
    
    var $parameter1;
    
    function TestClass($newValue)
    {
        $this->parameter1 = $newValue;
    }

    function subMethod1()
    {
        $tstring = '12test45';
        preg_replace_callback('/(test)/', create_function('$matches', 'global $c; $c->subMethod2($matches[0]."plus");'), $tstring);
    }
    
    function subMethod2($string)
    {
        echo 'Submethod called from external function returned: <b>'.$this->parameter1.'</b> and get $string param = '.$string;
    }

}
    
$c = new TestClass('Value of parameter1 set by the class call');
$c->subMethod1();

?>

PM MAIL   Вверх
Mal Hack
Дата 8.2.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Ты в create_function вызываешь метод, а мне надо функцию вне класса вызвать, а уже в ней метод.
PM ICQ   Вверх
smartov
Дата 8.2.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



Mal Hack
Ты не обижайся. Я смотрю ты ведь даже FAQ ведешь...
Я же показал примером что global прекрасно работает. Дополнить код так как тебе надо, было уже просто делом техники.

Код

<?

class TestClass
    
{
    
    var $parameter1;
    
    function TestClass($newValue)
    {
        $this->parameter1 = $newValue;
    }

    function subMethod1()
    {
        $tstring = '12test45';
        preg_replace_callback('/(test)/', create_function('$matches', 'global $c; abc(&$c, $matches[0]."plus");'), $tstring);
    }
    
    function subMethod2($string)
    {
        echo 'Submethod called from external function returned: <b>'.$this->parameter1.'</b> and get $string param = '.$string;
    }

}

function abc(&$obj, $string)
{
    $obj->subMethod2($string." also added from external function");
}

$c = new TestClass('Value of parameter1 set by the class call');
$c->subMethod1();

?>


p.s. код проверен и рабочий.
PM MAIL   Вверх
AntonioBanderaz
Дата 8.2.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


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

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



эээ как я понял...

Код

function tralala($str) {
     echo 'trallalla '.$str;
}
global $func_name = 'tralala';

//к функции tralala можно обратиться так 
$func_name("tralllallllalllla");


ну а вот с классами нет PHP под рукой чтоб проверить... но должно сработать

Цитата(Mal Hack @ 8.2.2006, 16:15 Найти цитируемый пост)

а мне надо функцию вне класса вызвать, а уже в ней метод.

не понял чутка что значит метод функции???


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

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


 




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


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

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