全局变量与局部变量

时间:2013-08-01 07:46:49

标签: php variables global local

好吧,我不确定我是否正确理解这个概念(我正在学习PHP)。如果我理解正确: 全局变量可以在同一文档中的任何位置引用,也可以在与“include”链接的文档中引用。局部变量只能在它们所在的函数中引用。

好的,如果我理解正确(这是我发布的原因的一半,以确保我有这个权利)是否真的需要局部变量?我的意思是,如果每个用户都定义了他们自己的变量并且他们需要全部保存,我可以看到它有用......那种?但是,使用数据库会更简单,我想。我想在哪些情况下使用局部变量?

6 个答案:

答案 0 :(得分:9)

您的问题是有道理的,直到您要求需要本地变量。总的来说,你应该尽可能地避免全局变量。

我编写一些工具/ webapp并且只有两个或三个拥有的全局变量并不罕见,我用它来设置实际的应用程序。

考虑一下:

$db = new PDO($conn, $usr, $pass);
function select(array $fields, $tbl, $where = '')
{
    global $db;//use the global variable
    return $db->query('SELECT '.implode(', ', $fields).' FROM '.$tbl.' WHERE '.$where);
}

您可能会认为此代码始终可以正常运行。很清楚$db是什么,所以这里没有明显的错误。
但是,假设您包含一些使用相同$db var的其他文件,并且其中一个文件中存在错误,导致$db被重新分配:

$db = 'I used to be a PDO instnace';
select(array('*'), 'tbl');

这将显示一个错误,指向您的行return $db->query();,它会说“试图调用非对象的方法

祝你好运调试! $db在哪里被重新分配?除了逐步筛选代码外,没有办法知道。

声明一切全球就像每晚都把钱包放在一边散步。

它可能仍然是你最后离开它的地方,但其状态(或价值)可能已被某些其他实体/实体(人或代码)(可能已使用您的钱包(或变量))更改(显着)作为他们自己,幸福地没有意识到你把它留在那里以供将来参考。在编写类或函数时,您也可以参考将该代码用作用户的同事。因此即使他们没有伤害,全球也是一个意外,等待发生。

顺便提一下,函数参数局部变量,所以我确定你已经在不知情的情况下使用它们了。

如下定义select函数要好得多:

function select(PDO $connection, array $fields, $tbl = 'tbl', $where = null)
{
    $query = 'SELECT '.implode(', ', $fields).' FROM '.$tbl;
    $query .= $where !== null ? ' WHERE '.$where : '';
    return $connection->query($query);
}

在这个功能中,我创建了一个局部变量,使代码更具可读性/可维护性。就像我说的那样,所有的参数都是局部变量,所以在这个函数返回之后,可以释放为了容纳它们所持有的值而分配的任何内存。当您使用全局变量时,垃圾收集器无法完成其工作,因为变量仍在范围内,并且可能会在代码中进一步使用。只有在脚本运行完毕后才会释放内存。

Globals每次尝试释放内存时都会告诉垃圾收集器 “等一下”,因为脚本以后可能需要变量。充满了Globals的代码是一个更糟糕的事情。

Globals(全球范围内的变种)会造成混乱的代码,当你试图避免名称冲突时,你会发现自己声称像$i_for_looping_over_array1 = 0;

这样的变种

好吧,这可能有点极端,但无论如何你最终会伪造你的vars,所以为什么不使用正确的命名空间,范​​围,类等?

使用global关键字很慢

每当你在函数中使用global关键字时,你就会有效地说:找一个名为$someName的变量,它可以在任何地方。将相同的变量作为参数传递,告诉函数使用此

传递对象时,实际上是在传递对该对象的引用(即其地址),因此不需要查找。原始文件被复制,因此也没有查找。

将自己视为调酒师。你宁愿在哪里工作? Pub AllIsGlobalHere,在你的第一天,你的老板说:“如果顾客要求什么,瓶子可以在任何地方,酒窖,地板或右上方的橱柜”,或Pub CheckTheArguments。后者是您直接进入的地方,当客户要求啤酒时,您的老板和/或客户会帮助指出您应该参考的草稿。

答案 1 :(得分:2)

封装需要局部变量,这是编程中的一个很好的实践。

全局变量实际上是一种不好的做法,因为变量可以在应用程序的任何地方改变,并且相信我,很难调试为什么变量的值不是预期的,如果你有倍数包括倍数包含。 ..

如果你需要使用全局变量,也许你应该考虑使用单例或将变量作为参数传递给需要它的函数。

答案 2 :(得分:1)

在编程中,在许多情况下,您只需要在隔离的上下文中使用变量。用于存储计算中期结果的计数器,函数参数和变量等等,对整个应用程序没有任何兴趣。 此外,还有递归函数的特殊情况。局部变量将为递归函数的每个实例获取它们自己的不同地址,这是递归正常工作的必要条件。 但是,在PHP应用程序中,建议尽可能避免使用全局变量。

答案 3 :(得分:0)

只有几个理由更喜欢本地人超过全球:

变量占用内存。如果每个变量都在全局范围内,那么会占用大量内存。局部变量只在它们在范围内时才存在,所以它们只是临时使用内存,然后再次释放内存....所以更好的内存使用是一个很好的论据。

如果所有变量都是全局变量,那么函数A和函数B都可能更新变量,但是都没有意识到另一个变量已经改变了,所以它可能导致你没有意识到某个值已被改变的情况一个函数,并假设它在另一个函数中仍然有效。

答案 4 :(得分:0)

  

我想在哪些情况下使用局部变量?

局部变量是在局部范围(函数)中定义的变量,这些变量仅在该范围内可用,但不在外部,例如:

$foo = 'foo';
function bar(){
 $foo = 'bar';
}

echo $foo; //prints foo
例如,您可以看到相同的变量名称可以在局部范围内使用而不会产生任何影响。

答案 5 :(得分:0)

如果你只使用全球变量,你需要给每个新的计数器一个新名称,哈哈。

封装需要vars的可见性:变量只能受您想要访问它的对象的影响。例如:

class Person{
  private $_money;
  public function rob(){
    return $this->_money;
  }
}

只有班级的对象可以操作他的钱,所以,如果你想要它们,你必须得到面具和枪。