Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP5升级到PHP7后返回NULL的PHP动态变量_Php_Variables - Fatal编程技术网

从PHP5升级到PHP7后返回NULL的PHP动态变量

从PHP5升级到PHP7后返回NULL的PHP动态变量,php,variables,Php,Variables,我正试图修复我的一个旧网站,目前不工作。我已将问题简化为以下代码: <?php global $options; foreach ( $options as $value ) { if ( isset( $value['id'] ) ) { var_dump($value); $test = $value['id']; if ( get_option( $value['id'] ) === FALSE ) { $$value['id'

我正试图修复我的一个旧网站,目前不工作。我已将问题简化为以下代码:

<?php

global $options;


foreach ( $options as $value ) {
if ( isset( $value['id'] ) ) {

    var_dump($value);  

    $test = $value['id'];

    if ( get_option( $value['id'] ) === FALSE ) {
        $$value['id'] = $value['std'];
    } else {
        $$value['id'] = get_option( $value['id'] );
    }

    var_dump($$value['id']);  // returns "Boxed"
    var_dump($$test);  // return NULL
    break;
}
}

?>
我不明白的是:输出$$value['id']如何工作,但首先将该值赋给$test=$value['id']会导致$$test不工作


旧网站的PHP版本非常旧(您需要将
$$value['id']
替换为
${$value['id']}

这是因为:

  • 如果$value是一个字符串,如“cheese”,那么动态变量将解析为
    $cheese['id']
    ,即,您将寻找一个名为
    $cheese
    的数组,其键为
    id
  • 如果$value是一个数组,如
    ['id'=>'celta_type']
    ,就像您的例子一样,那么动态变量将解析为
    $celta_type
这称为歧义问题,请参见此处:

您是对的,这在PHP 5和PHP 7之间发生了变化:


顺便说一句,如果我是你,我不会使用动态变量,因为它们是不安全和不可预测的。你可以重写你的函数以使用数组,如下所示:

$optionValues[$value['id']] = get_option($value['id']);

if ($optionValues[$value['id']] === false)
    $optionValues[$value['id']] = $value['std'];


语法错误$test!=$$test你能再解释一下吗?谢谢你的详细回答。这很有意义
$optionValues[$value['id']] = get_option($value['id']);

if ($optionValues[$value['id']] === false)
    $optionValues[$value['id']] = $value['std'];
$optionValues[$value['id']] = get_option($value['id']) === false ? $value['std'] : get_option($value['id']);