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

参考文献:

  • 如果我将一个变量传递给一个函数(例如$ var),是否应该是对实际变量的引用的副本(例如将其设置为null不会影响其他副本)?
  • 或者它是否接收到什么是实际变量的新副本的引用(例如,将其设置为空仅销毁其副本)?
  • 如果是后者,是否在内存中复制对象和数组? 这似乎是一种浪费内存和CPU时间的好方法,如果是这样的话。
  • 首先,我认为通过了解它是如何工作的,可以正确理解通过引用(例如&$ var)的传递。

    范围:

  • 与本地范围有什么关系? 我是否正确地观察到我可以在一个函数中声明一个数组,然后在该函数内调用的其他函数中使用该数组,而不将它作为参数传递给它们?
  • 同样,在函数内调用的函数中声明数组是否允许它在调用者中可用?
  • 如果没有,范围工作的调用堆栈或类似每一个血腥的事情,我已经了解编程告诉我它应该?
  • PHP非常有趣。 :(


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

    取决于功能。 还有你怎么称呼它。 看看这个例子:http://www.ideone.com/LueFc

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

    再次取决于功能

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

    当然,它将节省内存以使用参考。 在php> 4中,除非您另外指定,否则它始终使用对象的引用。

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

    不,你不能。

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

    不,它没有。

    如果没有,范围工作的调用堆栈或类似每一个血腥的事情,我已经了解编程告诉我它应该?

    如果你想在函数外使用一个变量,那么在使用它之前,你需要编写global $outsidevar


    关于你的第一组问题:

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

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

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

    那么,整个事情并不是那么简单,而是要回答你的问题:不,它不会复制变量,除非在函数中写入变量,否则不会使用引用保存CPU和内存。 在大多数情况下,引用不会改变性能,但在最坏的情况下,它实际上会降级它(因为如果变量的非is_ref变量已经存在并且创建了引用,则必须复制该变量的值以获取带有is_ref的zval和没有的zval)。 使用引用优化代码并不好。


    如果函数的参数被定义为如此“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'
    
    链接地址: http://www.djcxy.com/p/50095.html

    上一篇: Help me understand PHP variable references and scope

    下一篇: "Execute and Update '# =>' Markers" for VIM