【问题标题】:assign array to static function variable php将数组分配给静态函数变量php
【发布时间】:2016-07-13 17:24:12
【问题描述】:

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

我已经通过use关键字将$parametersArray传递给回调方法如下(正则表达式匹配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)

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

将数组作为变量直接赋值给函数内静态定义的变量有问题吗?

【问题讨论】:

  • 你能分享一个$string吗?此外,您的回调与$matches 无关,为什么要使用preg_replace_callback?顺便说一句,您也不必指定另一个数组,请参阅ideone.com/F7SoTc
  • 我已编辑问题以添加$string。这个想法是相应地用数组值替换匹配项。 $matches 可以从回调方法定义中省略,你是对的。
  • 好问题,但正确缩进代码有这么难吗?
  • @hek2mgl 我只是为发光体保留一些空间......

标签: php arrays regex


【解决方案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
);

【讨论】:

  • 你在开玩笑吧......这到底是怎么回事:D!真的,对此有任何解释还是您只是尝试过?很好的收获:)
  • @KAD 在第一次函数调用时,静态变量有一个null 值,因为它刚刚被声明。在下一个函数调用中,变量已经有一个来自传递数组的值。
  • 好吧,@MarcB 的回答有助于解释这一点,Static declarations are resolved in compile-time.,所以当您尝试使用表达式设置变量时,表达式直到运行时才能解析。我敢打赌 if 条件(和它的内容)这里跳过了编译时对变量设置的评估,因此使设置动作安全,如果错了请纠正我
【解决方案2】:

根据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;
}

【讨论】:

  • 您能帮我们评估一下@user1636505 方法在技术上是如何解决问题的吗?
  • 未声明的变量默认为空值。所以所做的只是使... = $var 部分成为运行时分配,而不是编译时。这一切都很好,而且很花哨,但是如果你想要初始化的 var 的值自然而然地变为 null,那么当你可能不希望它发生时,该赋值操作将再次发生。这没什么神奇的 - 您现在使用“内联信号”来模拟正常的静态 var 创建会做什么,并且任何内联信号都可能被滥用/失败。
【解决方案3】:

您可以引用该数组,然后在闭包中使用它的原始值。请注意,参数在 definition 时被初始化,而不是在您 调用 时 - 所以这可能对您有用:

<?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
?>

【讨论】:

  • 我已经删除了$matches,不需要它。这是通过引用解决问题的好方法,但是假设我想在外部范围内保持原始数组相同,有没有办法在函数内静态分配它?
  • @KAD:已经离开了,但是之前看到更新的答案和解释。
猜你喜欢
  • 2022-07-21
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多