0

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

$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 处理的吗?

如果我的假设是错误的,那么如果你能提供更好的例子,那真的很有帮助,也许只使用上述方法之一就可以完成?

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

4

4 回答 4

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;

于 2012-04-07T03:59:33.400 回答
2

在第一个示例中,$var内部的局部变量myFunc()将通过引用存在于全局范围内的同名变量来分配(可通过 superglobal 访问$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);

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

于 2012-04-07T04:04:18.833 回答
1

您的两个示例之间根本没有技术差异;它们将始终以相同的方式运行。

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

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

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

所以总而言之:

  • 他们做同样的事情
  • 如果你打算使用其中一种,更喜欢第二种形式(更清晰,更灵活)
  • 如果不需要编写大量额外代码,请考虑不使用它们并做其他事情
于 2012-04-07T09:18:31.493 回答
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

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

于 2012-04-07T04:02:21.923 回答