Каково реальное использование переменных переменных? - PullRequest
9 голосов
/ 19 августа 2010

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

Ответы [ 6 ]

4 голосов
/ 19 августа 2010

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

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

2 голосов
/ 19 августа 2010

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

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

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

1 голос
/ 19 августа 2010

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

 $obj->media$title => Video title

Поэтому я использовал его как

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

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

1 голос
/ 19 августа 2010

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

$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 голос
/ 19 августа 2010

Подумайте об этом для использования в системе шаблонов, где вы используете файлы 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; ?>!
0 голосов
/ 11 августа 2017

Я в основном использую его, чтобы уменьшить копирование-вставку при очистке данных get / post в начале php-файла: Создает очищенные переменные с именами:

$fields=array('age','name','gender','email','username');

foreach($fields as $field) {
    if (empty($_REQUEST[$field] === false)
        ${$field} = sanitize($_REQUEST[$field]);
    else
        ${$field} = '';
}

вместо всех этих строк:

if (empty($_GET['age']) === false) 
    $age= sanitize($_GET['age']);
else
    $age= '';

if (empty($_GET['name']) === false) 
    $name= sanitize($_GET['name']);
else
    $name = '';

if (empty($_GET['gender']) === false) 
    $gender= sanitize($_GET['gender']);
else
    $gender= '';

if (empty($_GET['email']) === false) 
    $email= sanitize($_GET['email']);
else
    $email= '';

if (empty($_GET['username']) === false) 
    $username= sanitize($_GET['username']);
else
    $username= '';

Надеюсь, это поможет

...