Переменные переменных кажутся довольно крутыми, но я не могу придумать сценарий, где можно было бы использовать их в производственной среде. Каким будет такой сценарий? Как они использовались?
Его цель, я полагаю, состоит в том, чтобы позволить начинающим программистам динамически изменять данные без использования таких "сложных вещей", как составные типы (массивы и объекты).
Я никогда их не использую.
Я нашел его полезным в одном сценарии. У меня были результаты API YouTube в формате JSON, например
$obj->media$title => Video title
Так что я использовал его как
$mt = 'media$title';
$obj->$mt ;
Так что у меня это сработало:)
Лично я ими пользуюсь довольно часто. Все вызовы следующих типов используют переменные-переменные:
$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]
, так что это не лучший вариант использования (не говоря уже о том, что использование глобальных переменных обычно считается плохой практикой) ...
Переменная переменная по сути является массивом (карта / словарь). Следующие идеи являются эквивалентными:
<?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};
?>
Таким образом, вам никогда не «придется» использовать переменные переменные или свойства переменных, когда написание собственного контролируемого кода. Лично я предпочитаю никогда не использовать переменные переменные. Я иногда использую свойства переменных, но предпочитаю использовать массивы, когда буду обращаться к данным таким образом.
Подумайте об этом для использования в системе шаблонов, где вы используете файлы 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; ?>!