变量变量看起来很酷,但我想不出一个实际在生产环境中使用它们的场景。这种情况会是什么?他们是如何使用的?变量变量的实际用法是什么?
回答
我的目的是让新手程序员在不使用复杂类型(数组和对象)等“复杂东西”的情况下动态更改数据。
我从来没有使用过它们。
认为它在一个模板系统使用,你使用的是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; ?>!
同样的事情可以通过['extract']完成(http://ca.php.net/manual/en/function.extract.php) – 2010-08-19 16:20:33
现在你有一个bug'$ vars'有一个键'“文件“'。这就是为什么变量变量(和“提取”,为此)是危险的。在模板中使用类似'$ m ['var']'的东西会更难吗? – Artefacto 2010-08-19 16:23:21
@Daniel:代码示例明确表示可以使用extract()完成。这是一个例子。 @Artefecto:这不是为了演示安全而生成的,而是为了使用变量。我从不主张像$ _GET数组中的任何内容那样盲目地传递变量。 – Jage 2010-08-19 16:31:34
就个人而言,我使用它们相当频繁。以下类型的所有呼叫使用可变变量:
$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]
语法来完成,所以这不是一个好用例(更不用说使用全局变量通常被认为是不好的做法)。
我发现它在单一场景中很有用。我有一个JSON格式的YouTube API的结果,这样
$obj->media$title => Video title
所以我用它像
$mt = 'media$title';
$obj->$mt ;
所以它的工作对我来说在这里:)
您可以执行'$ obj - > {'media $ title'}'。 – Artefacto 2010-08-19 17:19:58
变量变量本质上是一个数组(地图/字典)。以下是等效的想法:
<?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文件的开头消毒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= '';
我希望它能帮助
为什么不只是'array_map'? – user151841 2017-08-12 02:05:36
- 1. 什么是实例变量?
- 2. 变量workspace_loc的实际值?
- 3. 实例变量的目的是什么?
- 4. 什么是变量?
- 5. 什么是“变量=变量|| {}”在JavaScript
- 6. 变量++和变量是什么意思?
- 7. PHP - 实际执行变量
- 8. 什么是isa实例变量?
- 9. 什么是vim的@@变量?
- 10. 什么是新的变量
- 11. 变量变量:什么时候有用?
- 12. 什么是原子变量,它的用法是什么?
- 13. GetTickCount()实际测量什么?
- 14. 什么时候显示mText(TextView的成员变量),实际上?
- 15. 什么时候变量的后缀操作符实际增加?
- 16. 什么是纯变量?
- 17. 为什么变量是NULL?
- 18. 什么是“安全变量”?
- 19. 什么是绑定变量?
- 20. 什么是const变量?
- 21. 什么是“自由变量”?
- 22. 什么是可选变量?
- 23. 什么是可变常量?
- 24. 为什么在Session_Controller中使用局部变量而不是实例变量
- 25. 瞬态变量的用途是什么?
- 26. Bash变量$ _的用例是什么?
- 27. 在java中命名变量的做法。为什么类变量不包变量
- 28. 什么类型的变量是打开文件的变量?
- 29. 我的Typescript变量的变量类型是什么?
- 30. 在这段代码中,变量实际上并没有改变,为什么?
//让新手程序员动态地更改数据,而不使用“复杂的东西”之类的复合类型(数组和对象)// 一旦学习完毕,它并不复杂。 – dreftymac 2012-11-26 23:18:10
我认为这是引号的意思。 – user151841 2012-11-27 15:19:58
这个答案如何得到upvoted很多次,并被接受? – jasonszhao 2014-06-04 00:15:15