Зачем использовать динамические переменные (переменные) в PHP или других языков

Я только недавно познакомился с концепцией динамических переменных в PHP. Мне кажется, что использование динамических переменных в программе затруднит чтение / отслеживание.

может ли кто-нибудь объяснить мне преимущества и/или поделиться реальным простым примером реального мира, когда может потребоваться динамическая переменная в PHP?

Если вам интересно, какие динамические переменные и как они работают, проверьте этот вопрос

2 ответов


Я проголосовал, чтобы закрыть этот вопрос (голосование с момента отзыва) на основе его субъективности, но по размышлении, я думаю, что могу дать объективный ответ.

имя статической переменной-это последовательность символов, представляющая токен, который базовый движок использует в качестве метки для идентификации значения, которое представляет переменная (описание очень очень непрофессионала).

"последовательность символов" - это строка. А строка - это выражение, которое представляет собой строка. Отсюда следует, что любое выражение, представляющее строку, должно быть достаточно хорошим, чтобы представлять токен, ссылающийся на переменную. И само это выражение может быть присвоено переменной, и оттуда можно получить имена динамических переменных.

но это не то, что вы просили. Вы спросили: почему?

Это не для разработчиков языка, чтобы отвечать на такие вопросы. Это их работа-обеспечивать единообразие и предсказуемость. интерфейс программирования, через их язык. Это униформа уметь представлять последовательность символов через выражение, которое в свою очередь может быть представлен переменной. Дело сделано.

субъективно я мог бы потенциально видеть, где некоторые данные импортируются из внешнего источника, и даже схема данных является динамической. Можно было бы представить это каким-то общим способом объекта, и это приводит оттуда, что имена свойств объекта также может быть динамичным. Независимо от того, может ли это быть хорошим подходом к рассматриваемой проблеме, это полностью субъективно и зависит от мнения разработчика и его коллег во время обзора кода.

Другим примером может быть то, что вы унаследовали какой - то дрянной код спагетти, где "потребности должны" и использование динамического именования - по какой-либо причине-может быть хорошим подходом.

нагрузка PHP заканчивается предоставлением механизма для написания кода; он не говорит о качестве о конструкции указанного кода. Для этого и нужен обзор кода.


A variable variable, это просто еще одна форма отражение. Вы в основном спрашиваете: "почему вы хотите изменить переменную, если вы не знаете ее до выполнения".

хотя технически не то же самое, вы могли видеть variable variable как другой вид hash table (или array в php). Большинство variable variables может быть переписан как hash table, и вы не удивитесь. Но если вам нужно работать с переменной до и после выполнения hash table может быть даже больше ужасно работать.

простой вариант использования может быть настройками, которые могут быть изменены пользователем. Имейте в виду, что следующий пример небезопасен, но демонстрирует его цель.

<?php
/*
Simple way, if you have a limited amount of settings
*/
$settings = array();
$settings["allowAccess"] = 1;
$settings["allowModify"] = 1;
$settings["allowDelete"] = 0;

if ($result = $mysqli->query("SELECT `allowAccess`, `allowModify`, `allowDelete` FROM `user_settings` LIMIT 1"))
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    $settings["allowAccess"] = $row["allowAccess"];
    $settings["allowModify"] = $row["allowModify"];
    $settings["allowDelete"] = $row["allowDelete"];
}

/*
Now consider you have a thousand settings and you dont want to write out every setting manually.
*/
if ($result = $mysqli->query("SELECT * FROM `user_settings` LIMIT 1"))
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    foreach($row as $key => $val) {
        $settings[$key] = $val;
    }
}

/*
Both options work, but everytime you want to use a setting you have to use something like below
*/

if ($settings["allowAccess"] && $settings["allowModify"] && $settings["allowDelete"]) {
    unlink($somefile);
}

/*
Perhaps you would rather write
*/

if ($allowAccess && $allowModify && $allowDelete) {
    unlink($somefile);
}

/*
Then you can use
*/
if ($result = $mysqli->query("SELECT * FROM `user_settings` LIMIT 1"))
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    foreach($row as $key => $val) {
        //if you use extract, all columns are extracted, unless you drop them first. But perhaps you need those for something else.
        //now I extract the columns that start with allow and keep the columns like id, created, modified, etc. without the need to specify each column manually, which makes it easier if you ever decide to add another setting column. You don't need to update this part of the code.
        if (substr($key,0,5)=='allow') {
            $$key = $val; //$key = 'allowAccess', $$key == $allowAccess = $val;
        }   
    }
}
?>

это только один пример, я нашел другой пример в XHTML sanitizer for MediaWiki by Brion Vibber. Он использует много массивов в своем коде, и в какой-то момент ему нужно было перевернуть их все. Он использовал код ниже:

<?php
$vars = array( 'htmlpairs', 'htmlsingle', 'htmlsingleonly', 'htmlnest', 'tabletags',
                'htmllist', 'listtags', 'htmlsingleallowed', 'htmlelements' );
foreach ( $vars as $var ) {
    $$var = array_flip( $$var );
}

?>

теперь очевидно, что он мог бы написать код ниже, но это действительно легче читать?

<?php                                   
$htmlpairs = array_flip($htmlpairs);
$htmlsingle = array_flip($htmlsingle);
$htmlsingleonly = array_flip($htmlsingleonly);
$htmlnest = array_flip($htmlnest);
$tabletags = array_flip($tabletags);
$htmllist = array_flip($htmllist);
$listtags = array_flip($listtags);
$htmlsingleallowed = array_flip($htmlsingleallowed);
$htmlelements = array_flip($htmlelements);
?>

что также вводит другой вариант использования: что, если бы я хотел динамически решить, какие массивы перевернуть? В variable variable путь, я могу просто нажать элементы на массив и перевернуть их, когда придет время, "нормальным" способом мне понадобится switch или if цикл через массив, а затем добавить каждый параметр вручную.