你问的问题是正确的,直到你要求需要局部变量.总的来说,你应该尽可能地避免全局变量.
我编写一些工具/ 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);
}
Run Code Online (Sandbox Code Playgroud)
就其本身而言,您可能会认为此代码始终可以正常运行.很明显是什么$db,所以这里没有明显的错误.
但是,假设您包含了一些使用相同$dbvar 的其他文件,并且其中一个文件中存在一个错误,导致$db重新分配:
$db = 'I used to be a PDO instnace';
select(array('*'), 'tbl');
Run Code Online (Sandbox Code Playgroud)
这将显示一个错误,指向您读取的行,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);
}
Run Code Online (Sandbox Code Playgroud)
在这个功能中,我创建了一个局部变量,使代码更易读/可维护.就像我说的那样,所有的参数都是局部变量,所以在这个函数返回之后,可以释放任何分配用来容纳它们所持有的值的内存.当您使用全局变量时,垃圾收集器无法完成其工作,因为变量仍在范围内,并且可能会在代码中进一步使用.只有在脚本运行完毕后才会释放内存.
Globals(全球范围内的变种)会造成混乱的代码,因为当你试图避免名称冲突时,你会发现你自己宣称像vars一样 $i_for_looping_over_array1 = 0;
好吧,这可能有点极端,但无论如何你最终会伪造你的vars,所以为什么不使用适当的命名空间,范围,类等?
global关键字很慢每当你global在函数中使用关键字时,你就会有效地说:寻找一个叫做的变量$someName,它可以在任何地方.将相同的变量作为参数传递,告诉函数使用它.
传递对象时,实际上是在传递对该对象的引用(即其地址),因此不需要查找.原始文件被复制,因此也没有查找.
把自己想象成一个调酒师.你宁愿在哪里工作?Pub AllIsGlobalHere,在你的第一天,你的老板说:"如果顾客要求什么,瓶子可以在任何地方,酒窖,地板或右上方的橱柜",或Pub CheckTheArguments.后者是您直接进入的地方,当客户要求啤酒时,您的老板和/或客户会帮助指出您应该参考哪个草稿.