2010-08-19 59 views

回答

4

我的目的是让新手程序员在不使用复杂类型(数组和对象)等“复杂东西”的情况下动态更改数据。

我从来没有使用过它们。

+0

//让新手程序员动态地更改数据,而不使用“复杂的东西”之类的复合类型(数组和对象)// 一旦学习完毕,它并不复杂。 – dreftymac 2012-11-26 23:18:10

+1

我认为这是引号的意思。 – user151841 2012-11-27 15:19:58

+1

这个答案如何得到upvoted很多次,并被接受? – jasonszhao 2014-06-04 00:15:15

1

认为它在一个模板系统使用,你使用的是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) – 2010-08-19 16:20:33

+2

现在你有一个bug'$ vars'有一个键'“文件“'。这就是为什么变量变量(和“提取”,为此)是危险的。在模板中使用类似'$ m ['var']'的东西会更难吗? – Artefacto 2010-08-19 16:23:21

+0

@Daniel:代码示例明确表示可以使用extract()完成。这是一个例子。 @Artefecto:这不是为了演示安全而生成的,而是为了使用变量。我从不主张像$ _GET数组中的任何内容那样盲目地传递变量。 – Jage 2010-08-19 16:31:34

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 2010-08-19 16:31:17

+0

虽然他们可以(种),如果这继续:http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto 2010-08-19 16:33:17

+0

这是一个可变函数。你是对的。它仍然在相同的主体上运行(其中变量被取消引用以确定执行路径)... – ircmaxell 2010-08-19 16:35:45

1

我发现它在单一场景中很有用。我有一个JSON格式的YouTube API的结果,这样

$obj->media$title => Video title 

所以我用它像

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

所以它的工作对我来说在这里:)

+0

您可以执行'$ obj - > {'media $ title'}'。 – Artefacto 2010-08-19 17:19:58

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文件的开头消毒GET/POST数据复制粘贴: 它使消毒变量与专有名词:

$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 2017-08-12 02:05:36