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, методом класса или глобальной функцией?

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


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