繁体   English   中英

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 处理?

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

好的,我在编写This Update时注意到一个不同之处,那就是在进行引用时,我可以选择新的变量名称,同时在函数 scope 中保留指向变量的指针。

在第二个代码块中,外部 $var 和内部 $var 是同一个元素。 另一方面,第三个代码块的行为更像第一个——但您可以访问和修改来自发送 function 的变量; 在第一个代码块中,您在内部对变量所做的任何编辑在 function 的 scope 之外不可用。


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

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

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变量将通过引用分配给全局 scope 中存在的同名变量(可通过超全局$GLOBALS访问)。 PHP 将其翻译成如下内容:

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

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

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

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

您的两个示例在技术上完全没有区别; 他们将始终以相同的方式行事。

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

此外,另一个区别(尽管不适用于此示例)是第一种形式只能在您的变量位于全局 scope 开头时使用; 第二个将无处不在。

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

所以总而言之:

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

一种按值传递,一种按引用传递:

按价值:

$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

在全局变量的情况下,您实际上是从全局变量 scope 中提取一个变量,并在 function 内部使用它。这就像通过引用隐式传递一样。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM