2010-08-19 3 views

ответ

4

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

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

+0

// позволяют начинающим программистам динамически изменять данные без использования «сложные вещи» как составных типов (массивы и объекты) // Это не сложно, как только вы узнали. – dreftymac

+1

Я думаю, что это смысл цитат. – user151841

+1

Как этот ответ получил так много раз и принял? – jasonszhao

1

Think его для использования в системе шаблонов, где вы используете 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

То же самое можно сделать с помощью '' extract' '(http://ca.php.net/manual/en/function.extract.php) –

+2

И теперь у вас есть ошибка '$ vars' имеет ключ' файл "'. Вот почему переменные переменные (и 'extract', если на то пошло) опасны. Было бы гораздо труднее использовать что-то вроде '$ m ['var']' в шаблоне? – Artefacto

+0

@ Даниэль: пример кода явно говорит, что это можно сделать с помощью extract(). Это был пример. @Artefecto: это не было сделано для демонстрации безопасности, но вместо этого использование переменных переменных. Я никогда не выступал за переменные вслепую, как в массиве $ _GET. – Jage

1

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

$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

Это не переменные переменные. Методы не являются переменными. – Artefacto

+0

Хотя они могут быть (вроде), если это будет продолжаться: http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto

+0

Это переменная-функция. Ты прав. Он по-прежнему работает с одним и тем же директором (где переменная разыменована для определения пути выполнения) ... – ircmaxell

1

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

$obj->media$title => Video title 

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

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

Так он работал для меня здесь :)

+0

Вы можете просто сделать '$ obj -> {'media $ title'}'. – Artefacto

2

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

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

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

0

основном я использую его, чтобы уменьшить копировать-вставить в дезинфицирующий прибудете/размещают данные в начале файла 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= ''; 

Я надеюсь, что это помогает

+0

Почему не просто 'array_map'? – user151841

Смежные вопросы