Передать переменную из функции во вложенную функцию
Вот один из методов класса
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 не помогает. |
replCB($resaults)? Оо
|
Раед,
А объяви function replCB() в самом начале после объявления $resaults = array() |
Цитата:
Цитата:
|
Цитата:
a= $resaults replCB(a) |
Цитата:
Во-вторых replCB вызывается функцией preg_replace_callback => я не могу передать ей параметр |
Раед,
в 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]; // работаем с переменной в глобалке } |
devote,
Спасибо, что разъяснили. С php знаком мало, поэтому иногда пытаюсь перенести туда прелести js. |
devote,
Ещё такой вопрос: Как я уже сказал, функция go является методом класса. Чем тогда является функция replCB при определении внутри функции go, методом класса или глобальной функцией? |
Цитата:
|
Цитата:
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" ); |
Цитата:
|
Цитата:
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 ); } } |
devote,
Огромное спасибо за помощь :thanks: |
не за что, спрашивайте если что.
|
Раед,
Я с таким тоже сталкиваюсь, и пардон, не тра*аю себе мозги, а добавляю переменную в сессию. |
Цитата:
|
Часовой пояс GMT +3, время: 12:54. |