全局变量与局部变量


Global Variables vs. Local Variables

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

好吧,如果我理解正确的话(这是我发帖的一半原因,以确保我有这个权利),真的需要局部变量吗?我的意思是,如果每个用户都定义了自己的变量,并且它们都需要保存,我可以看到它很有用。。。有点但是,我认为使用数据库会简单得多。在什么情况下我想使用局部变量?

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

对于我来说,写一些工具/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();的行,并且它将显示类似于"em"的内容;尝试调用非对象"的方法。

祝你调试成功!$db被重新分配到哪里?除了一步一步地筛选你的代码之外,没有其他方法可以知道

宣布一切Global就像每天晚上把钱包放在人行道上

它可能仍然是你最后一次把它放在那里的地方,但它的状态(或价值)很可能已经被其他实体(人或代码)(显著)改变了,他们可能把你的钱包(或变量)当成了自己的钱包,幸福地不知道你把它留在那里供将来参考。在编写类或函数时,您会将使用该代码的同事称为用户。因此,即使它们没有伤害,全球也只是一场等待发生的事故。

顺便说一句,函数参数局部变量,所以我相信你已经在不知不觉中使用了它们

最好将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);
}

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

全局参数告诉垃圾收集器";等待一分钟"每次它试图释放内存时,因为脚本稍后可能需要该变量。充满全局变量的代码是一群人会写的

全局变量(全局范围内的变量)会导致代码混乱,当你试图避免名称冲突时,你会发现自己声明的变量像$i_for_looping_over_array1 = 0;

好吧,这可能有点极端,但无论如何你都会以伪名称命名你的vars,所以为什么不使用适当的名称空间、作用域、类等呢。?

使用global关键字很慢

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

传递对象时,实际上是传递对该对象的引用(即其地址),因此不需要查找。基本体是复制的,因此也没有查找。

把自己想象成一个酒保。你更愿意在哪里工作?Pub AllIsGlobalHere,在你的第一天,你的老板说:";如果顾客要什么,瓶子可以放在任何地方,地窖、地板或右上角的橱柜";,或Pub CheckTheArguments。后者是你直接进去的地方,当顾客要啤酒时,你的老板和/或顾客会帮助你指出你应该参考哪种啤酒

封装需要局部变量,这在编程中是一种很好的做法。

事实上,全局变量是一种糟糕的做法,因为变量可以在应用程序中的任何地方更改,相信我,很难调试为什么如果您使用multiplex include和multiplex includes,变量的值不是预期的。。。

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

在编程中,有很多情况下您只需要在独立的上下文中使用变量。计数器、函数参数和用于存储临时计算结果的变量等等在整个应用程序中都不感兴趣。此外,还有递归函数的特殊情况。局部变量将为递归函数的每个实例获得自己不同的地址,这是递归正常工作的必要条件。然而,在PHP应用程序中,建议尽可能避免使用全局变量。

只有几个原因更喜欢本地而不是全局:

变量占用内存。如果每个变量都在全局范围内,则会占用大量内存。局部变量只有在作用域中时才存在,所以它们只是暂时使用内存,然后内存会再次释放。。。。因此,更好地使用内存是一个很好的论据。

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

在什么情况下我想使用局部变量?

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

$foo = 'foo';
function bar(){
 $foo = 'bar';
}
echo $foo; //prints foo

例如,您可以看到相同的变量名可以在本地范围内使用,而不会产生任何影响。

如果只使用全局变量,则需要为每个新计数器指定一个新名称,哈哈。

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

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

只有普通人才能操作他的钱,所以,如果你想要他们,你必须得到面具和枪。