PHP dynamici c переменная, возвращающая NULL после обновления с PHP 5 до PHP 7 - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь исправить мой старый веб-сайт, который в настоящее время не работает. Я сократил проблему до следующего кода:

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

?>

var_dump переменной $ value:

array(6) { ["name"]=> string(10) "Theme Type" ["desc"]=> string(29) "Select the type of the theme." ["id"]=> string(10) "celta_type" ["type"]=> string(6) "select" ["options"]=> array(2) { [0]=> string(5) "Boxed" [1]=> string(9) "Stretched" } ["std"]=> string(5) "Boxed" } string(5) "Boxed" NULL array(6) { ["name"]=> string(10) "Theme Type" ["desc"]=> string(29) "Select the type of the theme." ["id"]=> string(10) "celta_type" ["type"]=> string(6) "select" ["options"]=> array(2) { [0]=> string(5) "Boxed" [1]=> string(9) "Stretched" }

Что я не понимаю, это следующее: как это возможно, что выходное значение $$ ['id'] работает, но если сначала присвоить значение $ test = $ value ['id'], тест $$ не будет работать.

Старый веб-сайт был на очень старой PHP версии (<5.3), возможно, что-то изменилось в более новых PHP ревизиях? </p>

спасибо за точку в правильном направлении

1 Ответ

1 голос
/ 13 апреля 2020

Вам необходимо заменить $$value['id'] на ${$value['id']}.

Это потому, что:

  • Если $ value является строкой, например, «cheese», то Dynami * Переменная 1034 * будет преобразована в $cheese['id'], т.е. вы будете искать массив с именем $cheese с ключом id
  • Если $ value это массив, такой как ['id' => 'celta_type'], как в вашем В этом случае переменная Dynami c будет преобразована в $celta_type

Это называется проблемой неоднозначности, см. здесь: https://www.php.net/manual/en/language.variables.variable.php

Вы правы, что это изменилось между PHP 5 и PHP 7: https://www.php.net/manual/en/migration70.incompatible.php#migration70 .incompatible.variable-processing.indirect


Кстати, если бы я был вами Я бы не использовал динамические переменные c, поскольку они небезопасны и непредсказуемы. Вы можете переписать вашу функцию для использования массива следующим образом:

$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']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...