2010-11-14 93 views
9

可能重复:
What does $$ (dollar dollar or double dollar) mean in PHP?双美元符号的PHP

我发现自己使用这种代码在我的控制器之一:

foreach(get_object_vars($this->view) as $property=>$value){ 
    $$property = $value; 
} 

有没有使用任何问题$$属性将视图属性“本地化”为简单的$变量?

编辑:

我要补充一点,代码视图中的特定方法的范围运行,所以没有压倒一切的局部变量的问题。这是为了让你们中的一些人指出重写局部变量的问题。

+2

可能重复的[$$在PHP中的含义是什么?](http://stackoverflow.com/questions/2715654/what-does-mean-in-php) – Charles 2012-01-21 19:22:31

回答

17

PHP中$$的问题是您创建了未知的变量名称,可能会覆盖您已经使用的变量名称。这是微妙的编程错误的来源,通常不应该使用。

+0

谢谢,有道理。但是,如果我在视图对象的上下文中使用它,唯一的属性是视图脚本要访问的值,我仍然可以自由使用它。 – Slavic 2010-11-14 20:28:13

+4

我不同意这个答案。如果你在一个View对象中使用它,那么你处于一个有限的范围内。如果你总是在全局范围内工作,那么如果你使用的是MVC结构,那么你就不会这样做。如果你的视图对象确实需要一些你不想重写的'保留'变量,把它命名为'$ _var',这样你就不会意外地覆盖它。 – 2010-11-14 20:52:55

+1

这就是为什么我写“一般”。斯拉夫似乎知道他在做什么。 – Erik 2010-11-14 21:28:27

1

不,这是做这件事的方法,也是唯一的方法,如果我没有弄错。虽然我的问题是问你为什么要这样做,而不是使用对象变量。

+0

这是因为我将值提供给视图脚本,它以$ value的方式访问更优雅的值,而不是$ this-> value时尚。 – Slavic 2010-11-14 20:23:09

5

那么,你可以只使用extract()函数。此外,该片段:get_object_vars($this->view)表示您应该有一些数组来存储这些变量,而不是一个对象。

+0

提取只适用于数组。我使用对象的原因是由于底层的代码结构。我在使用get_object_vars()时看不到问题; – Slavic 2010-11-14 20:27:10

+0

也许你想跳过提取,所以没有变量被覆盖。 – NikiC 2010-11-14 20:28:08

-1

接受的答案是如此错误! 双美元不是问题的原因,不应该被视为这样! 双美元语法实际上是一个很好的PHP功能,可以在许多情况下有用!

如果您担心您可能会使用它来覆盖其他变量,那么这意味着您编写的代码很差!无论如何,这个语法被更多有经验的程序员使用,所以初学者应该避免它,直到更确定他们在做什么。

某些情况下,这是通过变量基于其他变量,动态变量,无关变量的值循环真的很有用,等

再次,最后我说,双美元是一个强大的功能并应该像这样对待!拥有权利的同时也被赋予了重大的责任!

+2

功能强大,功能不强大,但从链接的问题来看,它似乎只是(简单形式)'eval'的快捷方式。它做了什么以外的事情? – greenoldman 2015-02-01 18:55:42