将数组赋给静态函数变量php

时间:2016-07-13 17:24:12

标签: php arrays regex

我有一个替换回调方法,我试图用相应的数组值替换多个字符串出现。

我已通过$parametersArray关键字将use传递给回调方法,如下所示(正则表达式匹配3个元素):

$string = 'Welcome Mr MM1, MM2 MM3 to the website';
$parametersArray = array('K', 'A' , 'AD');

$line = preg_replace_callback(
    '(MM[1-9])',
    // anonymous
    function () use ($parametersArray) {
        static $paramArray = $parametersArray;
        return array_shift($paramArray);
    },
    $string
);

我收到以下错误:

  

解析错误:语法错误,意外'$ parametersArray'(T_VARIABLE)

如果我明确地将数组设置为静态变量,我不会得到错误并获得预期的行为。

将数组作为变量直接分配给函数中的静态定义变量是否存在问题?

3 个答案:

答案 0 :(得分:1)

你可以像这样初始化静态变量

$line = preg_replace_callback(
    '(MM[1-9]{1})',
    // anonymous
    function ($matches) use ($parametersArray) {
        static $paramArray;

        if (null === $paramArray) {
            $paramArray = $parametersArray;
        }

        return array_shift($paramArray);
    },
    $string
);

答案 1 :(得分:1)

根据docs(参见示例#6):您无法使用表达式初始化静态变量:

<?php
function foo(){
    static $int = 0;          // correct 
    static $int = 1+2;        // wrong  (as it is an expression)
    static $int = sqrt(121);  // wrong  (as it is an expression too)

    $int++;
    echo $int;
}

答案 2 :(得分:0)

您可以引用该数组,然后在闭包中使用原始值。请注意,参数在定义时初始化,而不是在调用时 - 所以这可能适用于您:

<?php

$string = 'Welcome Mr MM1, MM2 MM3 to the website';

$parametersArray = array('K', 'A' , 'AD');
$refArray =& $parametersArray;
$line = preg_replace_callback(
            '(MM[1-9]{1})',
            // anonymous
            function () use (&$refArray, $parametersArray) {
                # stays the same in every call
                # it is a copy after all
                print_r($parametersArray);
                return array_shift($refArray);
            },
            $string
);

echo $line;
# Welcome Mr K, A AD to the website
?>