PHP全局和参考差异混淆

时间:2012-04-07 03:56:37

标签: php

有人可以向我解释以下内容的区别是:

$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如何处理它们?

如果我认为这是错误的,那么如果你能提供更好的例子,或者只使用上述方法中的一种方法可以实现的话,那将会有所帮助吗?

好的,我注意到在编写此更新时有一个区别,就是在执行引用时我可以选择新的变量名,同时保持指向函数范围中变量的指针。

4 个答案:

答案 0 :(得分:2)

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


编辑以匹配问题的修改。

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

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;

答案 1 :(得分:2)

在第一个示例中,$var内的本地myFunc()变量将通过引用与全局范围中存在的同名变量(可通过超全局$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);

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

答案 2 :(得分:1)

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

这让我们寻找其他类型的差异,并且这里存在非常重要的代码质量差异:在第一个版本中,查看调用站点不会告诉您该函数取决于全局。在第二个它将(它作为参数传递)。所以第二种形式至少在我的书中是优越的。

此外,另一个区别(虽然不适用于示例)是第一种形式只有在您的变量在全球范围内开始时才能使用;第二个将在任何地方工作。

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

总之:

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

答案 3 :(得分:0)

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

按价值:

$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

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