6

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

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

4

6 回答 6

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,因此这里没有明显的错误。
但是,假设您包含了几个使用相同$dbvar 的其他文件,并且其中一个文件中存在导致$db重新分配的错误:

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

这将显示一个错误,该错误会将您指向读取的行,return $db->query();并且会显示类似"trying to call method of non-object" 的内容

祝你调试好运!哪里被$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);
}

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

全局变量告诉垃圾收集器在每次尝试释放内存时“等待一分钟” ,因为脚本稍后可能需要该变量。充满全局变量的代码是一个部落会写的东西。

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

好吧,这可能有点极端,但无论如何你最终都会对你的 var 进行伪命名空间,那么为什么不使用适当的命名空间、范围、类等呢?

使用global关键字很慢

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

传递一个对象时,实际上是传递了对该对象的引用(即它的地址),因此不需要查找。原语被复制,所以也没有查找。

把自己想象成一个调酒师。你更愿意在哪里工作?Pub AllIsGlobalHere,在那里,您的第一天,您的老板说:“如果客户要求什么,瓶子可以在任何地方,地窖、地板或右上角的橱柜”,或 Pub CheckTheArguments。后者是您直接进入的地方,当客户要啤酒时,您的老板和/或客户会很有帮助地指出您应该参考哪个草案。

于 2013-08-01T07:57:28.637 回答
2

封装需要局部变量,这是编程中的一个好习惯。

全局变量实际上是一种不好的做法,因为变量可以在应用程序中的任何位置更改,相信我,如果您有多个包含和多个包含,那么很难调试为什么变量的值不是预期的......

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

于 2013-08-01T07:54:45.997 回答
1

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

于 2013-08-01T07:59:40.393 回答
0

选择本地而不是全局的原因有两个:

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

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

于 2013-08-01T07:56:39.323 回答
0

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

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

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

echo $foo; //prints foo

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

于 2013-08-01T07:58:32.437 回答
0

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

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

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

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

于 2013-08-01T07:59:43.907 回答