帮助我理解PHP变量引用和范围

时间:2011-01-20 16:35:21

标签: php variables reference scope list-comprehension

参考文献:

  1. 如果我将变量传递给函数(例如$ var),那应该是对实际变量的引用的副本(这样设置为null不会影响其他副本)?
  2. 或者它是否正在接收对实际变量的新副本的引用(例如,将其设置为null只会破坏其副本)?
  3. 如果是后者,这会将对象和数组复制到内存中吗?如果是这样的话,这似乎是浪费内存和CPU时间的好方法。
  4. 我认为首先可以通过了解其工作原理来正确理解传递(例如& $ var)。

    范围:

    1. 与当地范围有什么关系?我是否正确地观察到我可以在一个函数中声明一个数组,然后在该函数中调用的其他函数中使用该数组而不将它作为参数传递给它们?
    2. 同样,在函数内调用的函数中声明数组是否允许它在调用者中可用?
    3. 如果不是,确实通过调用堆栈或任何像我已经了解的关于编程的每一个血腥的事情来确定它应该是什么?
    4. PHP非常有趣。 :(

3 个答案:

答案 0 :(得分:2)

如果我将一个变量传递给一个函数(例如$ var),那应该是对实际变量的引用的副本(这样设置为null不会影响其他副本)?

取决于功能。以及你如何称呼它。看看这个例子: http://www.ideone.com/LueFc

或者它是否接收对实际变量的新副本的引用(例如,将其设置为null仅销毁其副本)?

再次取决于功能

如果是后者,这会将对象和数组复制到内存中吗?这似乎是浪费内存和CPU时间的好方法,如果是这样的话。

当然,它会节省内存以使用引用。在php> 4中,除非另有说明,否则它总是使用对象的引用。

与当地范围有什么关系?我是否正确观察我可以在一个函数中声明一个数组,然后在该函数中调用的其他函数中使用该数组而不将它作为参数传递给它们?

不,你不能。

同样,在函数内调用的函数中声明数组是否允许它在调用者中可用?

不,它没有。

如果没有,确定通过调用堆栈或任何类似于我已经了解的关于编程的每一个血腥的东西的工作范围告诉我它应该吗?

如果您想在函数外使用变量,在使用它之前,您需要编写global $outsidevar

答案 1 :(得分:1)

关于你的第一组问题:

foo($a);
function foo($b) { echo $b; }

在这种情况下,$a不会被复制到新变量$b,只是因为它是按值传递的。

这是因为PHP使用了copy-on-write概念。 PHP不会复制变量的内容,除非它们被更改。相反,PHP将增加refcount的现有“zval”的$a属性。

嗯,整件事情并不是那么微不足道,而是要回答你的问题:不,它不会复制变量,除非你在函数中写入它而不是,你不会通过使用一个来节省CPU和内存参考。在大多数情况下,引用根本不会改变性能,但在最坏的情况下,它实际上会降低它的性能(因为如果变量的非is_ref变量已经存在并且创建了引用,则变量的值必须被复制以获得is_ref和一个没有的zval。使用引用优化代码并不好。

答案 2 :(得分:1)

如果函数的参数定义为“function my_function($ variable){}”,那么您将获得该变量的副本,并且对函数内部变量所做的任何更改都不可用于函数调用者。您可以通过在定义函数时在参数前加上一个&符来传递变量,因此对变量所做的任何更改都将持续到函数调用者,即“function my_function(& $ variable){}”

function myfunction($var) {
    $var = 'World';
}
$var = 'Hello';
myfunction($var);
echo $var; // 'Hello';

通过引用传递变量

function myfunction(&$var) {
    $var = 'World';
}
$var = 'Hello';
myfunction($var);
echo $var; // 'World'