Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Передать переменную из функции во вложенную функцию (https://javascript.ru/forum/server/28844-peredat-peremennuyu-iz-funkcii-vo-vlozhennuyu-funkciyu.html)

Раед 04.06.2012 18:44

Передать переменную из функции во вложенную функцию
 
Вот один из методов класса
function go($mycbPhp, $mycb) {
  $repAll = "/(<\?(?:php)?.+\?>|<(?:c|m|=)%.+%e>)/sU";
  $resaults = array();
  if (!is_array($this->arrParsed)) return false;
  $evals = $this->arrParsed;
  foreach ($evals as $eval) {
   if ($eval['type']=='php') {
    $resaults[count($resaults)] = $mycbPhp($eval['string']);
   } elseif ($eval['type']=='templated') {
    $resaults[count($resaults)] = $mycb($eval['subtype'], $eval['string']);
   }
  }
  function replCB() {
   //сюда нужно передать переменную $resaults
   static $i = -1;
   $i++;
   return $resaults[$i];
  }
  return preg_replace_callback($repAll, 'replCB', $this->text);
 }

Как во вложенную функцию replCB передать переменную из функции go?
global не помогает.

Ska1n 04.06.2012 19:25

replCB($resaults)? Оо

Deff 04.06.2012 19:41

Раед,
А объяви function replCB() в самом начале после объявления $resaults = array()

Раед 04.06.2012 19:55

Цитата:

Сообщение от Ska1n
replCB($resaults)

Так вроде в $resaults попадёт массив вхождений регвыра в $this->text, а мне нужно передать туда переменную из фи-и.

Цитата:

Сообщение от Deff
А объяви function replCB() в самом начале после объявления $resaults = array()

Ммм.. Что-то не помогает.

Deff 04.06.2012 22:27

Цитата:

Сообщение от Раед (Сообщение 178895)
Цитата:

Сообщение от Ska1n
replCB($resaults)

Так вроде в $resaults попадёт массив вхождений регвыра в $this->text, а мне нужно передать туда переменную из фи-и.

function replCB(a) { .....}

a= $resaults
replCB(a)

Раед 04.06.2012 22:40

Цитата:

Сообщение от Deff
function replCB(a) { .....}

a= $resaults
replCB(a)

Во-первых не a, а $a.
Во-вторых replCB вызывается функцией preg_replace_callback => я не могу передать ей параметр

devote 04.06.2012 23:57

Раед,
в PHP нет такого понятия как вложенные функции, поэтому все функции в PHP создаются в глобальном пространстве, ваш код это всеравно что написать так:
function go($mycbPhp, $mycb) {
  $repAll = "/(<\?(?:php)?.+\?>|<(?:c|m|=)%.+%e>)/sU";
  $resaults = array();
  if (!is_array($this->arrParsed)) return false;
  $evals = $this->arrParsed;
  foreach ($evals as $eval) {
   if ($eval['type']=='php') {
    $resaults[count($resaults)] = $mycbPhp($eval['string']);
   } elseif ($eval['type']=='templated') {
    $resaults[count($resaults)] = $mycb($eval['subtype'], $eval['string']);
   }
  }
  return preg_replace_callback($repAll, 'replCB', $this->text);
 }

  function replCB() {
   //сюда нужно передать переменную $resaults
   static $i = -1;
   $i++;
   return $resaults[$i];
  }
И естественно переменную вы передать не сможете, но есть лишь один вариант, это сделать переменную глобальной.
function go($mycbPhp, $mycb) {
  $repAll = "/(<\?(?:php)?.+\?>|<(?:c|m|=)%.+%e>)/sU";
  $resaults = array();
  if (!is_array($this->arrParsed)) return false;
  $evals = $this->arrParsed;
  foreach ($evals as $eval) {
   if ($eval['type']=='php') {
    $resaults[count($resaults)] = $mycbPhp($eval['string']);
   } elseif ($eval['type']=='templated') {
    $resaults[count($resaults)] = $mycb($eval['subtype'], $eval['string']);
   }
  }
  $GLOBALS['resaults'] = &$resaults; // переносим переменную в глобальное пространство
  return preg_replace_callback($repAll, 'replCB', $this->text);
 }

  function replCB() {
   //сюда нужно передать переменную $resaults
   static $i = -1;
   $i++;
   return $GLOBALS['resaults'][$i]; // работаем с переменной в глобалке
  }

Раед 05.06.2012 00:02

devote,
Спасибо, что разъяснили. С php знаком мало, поэтому иногда пытаюсь перенести туда прелести js.

Раед 05.06.2012 00:22

devote,
Ещё такой вопрос:
Как я уже сказал, функция go является методом класса.
Чем тогда является функция replCB при определении внутри функции go, методом класса или глобальной функцией?

devote 05.06.2012 00:24

Цитата:

Сообщение от Раед
Чем тогда является функция replCB при определении внутри функции go, методом класса или глобальной функцией?

скорее всего глобальной, вы можете это проверить попробовав вызвать ее вне класса. Точно сказать не могу, внутри классов не создавал вложенных функций.

Раед 05.06.2012 00:33

Цитата:

Сообщение от devote
скорее всего глобальной, вы можете это проверить попробовав вызвать ее вне класса

Да, глобальной.
devote, а можно передать в preg_replace_callback метод класса

devote 05.06.2012 00:47

Цитата:

Сообщение от Раед
devote, а можно передать в preg_replace_callback метод класса

ну только примерно так:

class Test {

    private static function func( $match ) {
        print_r( "executed" );
		return "";
    }

	public function go( $rpl ) {
		return preg_replace_callback( "/a/", "Test::func", $rpl );
	}
}

$a = new Test();

$a->go( "testa" );

Раед 05.06.2012 01:03

Цитата:

Сообщение от Раед
а можно передать в preg_replace_callback метод класса

Извините, не так выразился, метод объекта, так чтобы был доступен $this

devote 05.06.2012 01:14

Цитата:

Сообщение от Раед
Извините, не так выразился, метод объекта, так чтобы был доступен $this

Ну сделайте сохранение ссылки на экземпляр, что-то вроде этого:
class Test {

	private static $instance = null;
 
    private static function func( $match ) {

		// тут работаем с экземпляром переданным через instance
        $self = Test::$instance;

        return $self->text;
    }

    public function go( $rpl ) {
		// сохраним ссылку на экземпляр
		Test::$instance = $this;

        return preg_replace_callback( "/a/", "Test::func", $rpl );
    }
}

Раед 05.06.2012 01:37

devote,
Огромное спасибо за помощь :thanks:

devote 05.06.2012 01:40

не за что, спрашивайте если что.

9xakep 05.06.2012 08:55

Раед,
Я с таким тоже сталкиваюсь, и пардон, не тра*аю себе мозги, а добавляю переменную в сессию.

devote 05.06.2012 13:37

Цитата:

Сообщение от 9xakep
Я с таким тоже сталкиваюсь, и пардон, не тра*аю себе мозги, а добавляю переменную в сессию.

не в каждом проекте используют сессии, и не забывайте о том что он пишет класс, а класс зависящий от сессий не совсем хорошо.


Часовой пояс GMT +3, время: 21:46.