全局变量可以在同一文档中的任何位置引用,也可以在与“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');
这将显示一个错误,指向返回$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(全局范围内的变量)会产生混乱的代码,当你试图避免名称冲突时,你会发现自己声称像$i_for_looping_over_array1 = 0的变量;
好吧,这可能有点极端,但无论如何你最终会伪造你的vars,所以为什么不使用适当的命名空间,范围,类等?
使用global关键字很慢
每当你在函数中使用global关键字时,你就会有效地说:找一个名为$someName的变量,它可以在任何地方.将相同的变量作为参数传递,告诉函数使用它.
传递对象时,实际上是在传递对该对象的引用(即其地址),因此不需要查找.原始文件被复制,因此也没有查找.
把自己想象成一个调酒师.你宁愿在哪里工作? Pub AllIsGlobalHere,在你的第一天,你的老板说:“如果顾客要求什么,瓶子可以在任何地方,酒窖,地板或右上方的橱柜”,或Pub CheckTheArguments.后者是您直接进入的地方,当客户要求啤酒时,您的老板和/或客户会帮助指出您应该参考哪个草稿.