【问题标题】:php 4 variable variablesphp 4 变量变量
【发布时间】:2026-01-25 22:45:01
【问题描述】:

$str='input_arr["用户名"]';

$input_arr=array();

$$str='abcd';

print_r($input_arr);

当我运行上面的代码时,它只打印 Array()。

我希望它打印 Array([username]=>'abcd')

我做错了什么?

顺便说一句,这是在 php 4 中。

非常感谢。

编辑:我想做什么?

$input_arr 应该是一个静态变量来保存经过验证的用户输入。但是,我最近才意识到 php4.3 不支持 self::$input_arr 所以我不得不将我的脚本编辑为 bar($input_arr['name'],$value);这样我就可以将值保存到 bar() 中的静态变量中;由于当前范围内不存在 $input_arr['name'],因此我必须将其设为字符串。

【问题讨论】:

  • 您使用的数组错误。变量变量很难调试。你到底想做什么?我确信有更好的方法来做到这一点。
  • 我用这个做了一些基本的测试,你是对的,它不起作用。最后,当我尝试通过变量变量摆弄数组元素时,它停止工作。如果我把整个数组弄乱了,我尝试的一切都很好。但是看起来你确实是在渡湖取水,你到底想完成什么?
  • 我添加了一些关于我想要做什么的信息。

标签: php arrays variables


【解决方案1】:

我会不惜一切代价努力避免eval。使用 PHP 的内置分词器。

<?php
error_reporting(-1);
$input = array(3 => array(5 => 'some value'));

echo '$input: '; var_dump($input);

echo '$input[3][5] (directly): '; var_dump($input[3][5]);

$str = '$input[3][5]';
echo "$str (as a variable variable): "; var_dump($$str);

echo "$str (using eval - don't use this!): "; var_dump(eval("return $str;"));

$var = null;
foreach (token_get_all("<?php $str") as $token) {
    if (isset($token[1]) && $token[1] === '<?php') {
        continue;
    }
    if (isset($token[0]) && $token[0] === T_VARIABLE) {
        $varName = substr($token[1], 1);
        $var = $$varName;
    } else if ($token === '[') {
        $currentIndex = null;
    } else if (isset($token[0]) && $token[0] === T_LNUMBER) {
        $currentIndex = $token[1];
    } else if ($token === ']') {
        $var = $var[$currentIndex];
    } else {
        // Handle/complain about unrecognized input.
    }
}
echo "$str (using tokenizer): "; var_dump($var);

输出:

$输入:数组(1){
  [3]=>
  数组(1){
    [5]=>
    string(10) "某个值"
  }
}
$input[3][5] (直接): string(10) "some value"
$input[3][5] (作为变量变量):
注意:未定义的变量:$input[3][5] in - on line 10
无效的
$input[3][5] (使用 eval - 不要使用这个!): string(10) "some value"
$input[3][5] (使用分词器): string(10) "some value"

【讨论】:

  • @Mystery person:想解释一下反对意见吗?我认为这是最安全的方法(请记住,变量变量仍然闻起来像糟糕的代码设计)并且我明确表示 eval 是邪恶的。您是否反对使用标记器而不是 eval,也许?
  • 有人对downvotes发疯了:p代码对我来说看起来很干净,upvoted。
【解决方案2】:

仍然很难说出您要做什么,但听起来您希望$str 确定$input_arr 内部的数据所在的位置。如果是这样,您应该只将数组键存储在$str 中,而不是代码的字符串表示形式。

在您的最后一个示例中,设置$str = 'name' 然后使用$input_arr[$str] 访问$input['name'] 一样简单。在第一种情况下,您可以使用数组$keys = array(3,5) 而不是$str,然后$input_arr[$keys[0]][$keys[1]] 将等效于$input_arr[3][5]

【讨论】:

    【解决方案3】:

    如果你真的想要这个,它可以使用 2 个变量。如果您使用对数组的引用而不是变量变量,那就更好了。

    $input_arr = Array();
    
    function somefunction($array, $key)
    {
        ${$array}[$key] = 'abcd';
    }
    
    function betterfunction(&$array, $key)
    {
        $array[$key] = 'abcd';
    }
    
    somefunction('input_arr', 'username');
    betterfunction($input_arr, 'username');
    

    【讨论】: