PHP全局变量和引用差异混淆


PHP Globals and Reference Difference Confusion

有人能向我解释一下以下内容的区别吗:

$var = 'something';
function myFunc(){
    global $var;
    // do something
}

和(注:参考符号&)

$var = 'something';
function myFunc(&$var){
    // do something
}

我无法理解这两种方法之间的区别。

更新

嗯。。。我想我有点困惑了:)

$var = 1;
$var2 = 2;
function myFunction(){
    global $var, $var2;
    $var = $var + $var2;
}

//echo$var将在此处返回3


$var = 1;
$var2 = 2;
function myFunction(&$a, &$b){
    $a = $a + $b;
}

//echo$var在这里也会返回3


我已经理解了这些部分,但我不明白的是这两种方法之间的区别,我错误地认为这两种方式在技术上是一样的,编码器如何编写它们以及PHP如何处理它们的概念不同吗?

如果我的假设是错误的,那么如果你能提供更好的例子,也许只使用上面的一种方法就可以完成一些事情,那真的会有帮助吗?

好的,我在编写ThisUpdate时注意到了一个区别,那就是在进行引用时,我可以选择新的变量名,同时将指向该变量的指针保留在函数范围中。

在第二个代码块中,外部$var和内部$var是同一个元素。另一方面,第三个代码块的行为与第一个代码块非常相似,但您可以从sending函数访问和修改变量;在第一个代码块中,内部对变量所做的任何编辑在函数范围之外都不可用。


编辑以匹配对问题的编辑。

&意味着我们通过引用传递变量。最好的描述方式是举例。

function test2(&$var) { $var = 2; }
function test() {
   $abc = 1;
   test2($abc);
   echo $abc;
}
test();

此代码将在屏幕上打印一个2。

$var = 0;
function test()
{
   global $var;
   $var = 1;
}
test();
echo $var;

这将打印1;

在第一个示例中,myFunc()内部的本地$var变量将通过引用分配给全局作用域中存在的同名变量(可通过超全局$GLOBALS访问)。PHP将其翻译为:

$var = 'something';
$GLOBALS['var'] = &$var;
function myFunc(){
    $var = &$GLOBALS['var'];
    // do something
}

在第二个示例中,您将变量显式传递给函数,因此它不是从全局范围中获取的。

$var = 'something';
$GLOBALS['var'] = &$var;
function myFunc(&$var){
    // do something
}
myFunc($var);

两个例子都引用了完全相同的变量,但使用了不同的机制。

您的两个示例之间没有任何技术差异;他们总是以同样的方式行事。

这让我们不得不寻找其他类型的差异,这里有一个相当显著的代码质量差异:在第一个版本中,查看调用站点不会告诉你该函数依赖于全局。在第二个中,它将(作为参数传入)。所以,至少在我的书中,第二种形式是优越的。

此外,另一个区别(尽管不适用于这个示例)是,只有当您的变量从一开始就在全局范围内时,才能使用第一种形式;第二种方法在任何地方都有效。

您还应该考虑到这两种方法都有一个输入/输出参数。通常情况下,如果它只是一个参数,您就不会编写这样的代码(因为您可以return out值),所以考虑给定多个参数的情况是很有趣的。这是非常罕见的,可以说,最好只返回一个具有多个值的数组,而不是通过引用获取多个参数,以使代码更容易理解。

所以总结一下:

  • 他们做同样的事情
  • 如果你打算使用其中一种,请选择第二种形式(更清晰、更灵活)
  • 如果不需要编写大量额外的代码,可以考虑使用none,并以其他方式进行操作

一个通过值,一个通过引用:

按价值:

$var = 'something';
function myFunc($var){
    $var = 'hello';
}
echo $var; //something

参考:

$var = 'something';
function myFunc(&$var){
    $var = 'hello';
}
echo $var; //hello

有关更多信息,PHP手册中有一个关于引用传递的页面:http://php.net/manual/en/language.references.pass.php

在全局的情况下,本质上是从全局范围中提取一个变量,并在函数内部使用它。这就像是通过引用隐式传递。

本页,特别是全局部分解释:http://us.php.net/manual/en/language.variables.scope.php

请注意,通常应避免使用全局变量。原因的简短版本是因为它们使了解程序的状态变得困难,并且以后的更改可能会导致意想不到的副作用。