Как на самом деле используются переменные переменные?

Переменные переменных кажутся довольно крутыми, но я не могу придумать сценарий, где можно было бы использовать их в производственной среде. Каким будет такой сценарий? Как они использовались?

9
задан Peter Mortensen 15 May 2011 в 10:36
поделиться

5 ответов

Его цель, я полагаю, состоит в том, чтобы позволить начинающим программистам динамически изменять данные без использования таких "сложных вещей", как составные типы (массивы и объекты).

Я никогда их не использую.

4
ответ дан 4 December 2019 в 21:47
поделиться

Я нашел его полезным в одном сценарии. У меня были результаты API YouTube в формате JSON, например

 $obj->media$title => Video title

Так что я использовал его как

$mt = 'media$title';
$obj->$mt ;

Так что у меня это сработало:)

1
ответ дан 4 December 2019 в 21:47
поделиться

Лично я ими пользуюсь довольно часто. Все вызовы следующих типов используют переменные-переменные:

$foo->$bar = 'test';
$foo->$bar();
$bar();

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

Обычно это используется для доступа к защищенным свойствам через __ get магический метод. Я довольно часто видел следующее:

public function __get($name) {
    return isset($this->$name) ? $this->$name : null;
}

Которая по определению использует переменные переменные для обеспечения доступа для чтения к защищенным членам ...

Я никогда не использовал напрямую $$ var синтаксис (и не думаю, что когда-нибудь буду). Я видел, как он используется для доступа к глобальным переменным по имени global $$ name; echo $$ name; , но то же самое можно сделать с помощью синтаксиса $ _ GLOBALS [$ name] , так что это не лучший вариант использования (не говоря уже о том, что использование глобальных переменных обычно считается плохой практикой) ...

1
ответ дан 4 December 2019 в 21:47
поделиться

Переменная переменная по сути является массивом (карта / словарь). Следующие идеи являются эквивалентными:

<?php
$foo = array('a' => 1);
$bar = 'a';
echo $foo[$bar]."\n";

$foo_a = 1;
$bar = 'a';
$vv = "foo_$bar";
echo $$vv."\n";
?>

Таким образом, если вы заключите свои «переменные-переменные» в родительский массив, вы можете избавиться от них.

Я видел, как люди используют свойства переменных внутри классов:

<?php
class Foo
{
  private $a = 1;

  public function __get($key)
  {
    if (isset($this->$key)) return $this->$key;
  }
}

$foo = new Foo();
echo $foo->a;
?>

Но опять же, вы можете использовать массив:

<?php
class Foo
{
  private $props = array('a' => 1);

  public function __get($key)
  {
    if (array_key_exists($key, $this->props))
      return $this->props[$key];
  }
}

$foo = new Foo();
echo $foo->a;
?>

И вне классов:

<?php
class Foo
{
  public $a = 1;
}

$foo = new Foo();
$prop = 'a';
echo $foo->{$prop};
?>

Таким образом, вам никогда не «придется» использовать переменные переменные или свойства переменных, когда написание собственного контролируемого кода. Лично я предпочитаю никогда не использовать переменные переменные. Я иногда использую свойства переменных, но предпочитаю использовать массивы, когда буду обращаться к данным таким образом.

2
ответ дан 4 December 2019 в 21:47
поделиться

Подумайте об этом для использования в системе шаблонов, где вы используете файлы PHP и должны устанавливать переменные:

function fetch_template($file, $vars){
    $ret = 'File not loaded.';
    if(file_exists(TEMPLATE_PATH.$file)){
        //could do this with extract() but I am showing you
        foreach($vars as $varName => $value){
            ${$varName} = $value;
        }
        ob_start();
        include(TEMPLATE_PATH.$file);
        $ret = ob_get_contents();
        ob_end_clean();
    }
    return $ret;
}

Теперь, предполагая, что вы использовали эти имена переменных в своем шаблоне, вы могли бы назвать его и передать в него переменные для использования.

echo fetch_template('hi_there.tpl', array('name'=>'JJ'));

Затем в вашем шаблоне:

Hello <?php echo $name; ?>!
1
ответ дан 4 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: