PHP: Как сделать переменную видимой в create_function()?

Этот код:

$t = 100;
$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
                            create_function(
                                  '$matches',
                                  'return $matches[1] + $t;'
                            ), $func);

Как сделать $t видимым из create_function() в функции preg_replace()?

5 ответов

Анонимная функция будет работать, используя при этом use синтаксис:

$t = 100;
$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
    function($matches) use($t) // $t will now be visible inside of the function
    {
        return $matches[1] + $t;
    }, $func);

Вы не можете сделать переменную доступной, но в вашем случае вы можете просто использовать значение:

$t = 100;
$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
                            create_function(
                                  '$matches',
                                  'return $matches[1] + ' . $t .';'
                            ), $func);

Тем не менее, настоятельно рекомендуется использовать function($matches) use ($t) {} синтаксис здесь ( http://php.net/functions.anonymous).

И есть модификатор Eval для preg_replace:

$str = preg_replace("/(Name[A-Z]+[0-9]*)/e", '$1+'.$t, $func);

Но у меня такое ощущение, что ваша функция в любом случае использует неправильный оператор - или неправильный шаблон / подшаблон.

В анонимном просто использовать ключевое слово use или global в create_function использовать global

Функция () использовать ($var1,$var2... и т. д.){код здесь}

или же

create_func($args,'global $var1,$var2; код здесь;');

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

$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
                            create_function(
                                  '$matches',
                                  'global $t; return $matches[1] + $t;'
                            ), $func);

Ты можешь использовать $GLOBALS но это не очень рекомендуется...

$str = preg_replace_callback ( "/(Name[A-Z]+[0-9]*)/", create_function ( '$matches', 'return $matches[1] + $GLOBALS["t"];' ), $func );

Лучшее решение

http://php.net/functions.anonymous анонимная функция.. если вы не любите использовать, вы также можете сделать array_walk ( http://php.net/manual/en/function.array-walk.php) после получения результата в формате массива передайте $t как правильный аргумент функции

Другие вопросы по тегам