在您要求需要本地变量之前,您的问题是有道理的。总的来说,您应该尽可能避免使用全局变量。
编写一些工具/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 变量的其他文件,并且其中一个文件中存在错误,导致 $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);
}
在这个函数中,我创建了一个局部变量以使代码更具可读性/可维护性。就像我说的,所有的参数也是局部变量,所以在这个函数返回之后,任何被分配来容纳它们持有的值的内存都可以被释放。当您使用全局变量时,垃圾收集器无法完成其工作,因为变量仍在范围内,并且可能会在代码中进一步使用。只有在脚本完成运行后才会释放内存。
全局变量会在每次尝试释放内存时告诉 垃圾收集器“等一下”,因为脚本稍后可能需要该变量。充满全局的代码是一个部落会写的东西。
全局变量(全局范围内的变量)会产生混乱的代码,当您试图避免名称冲突时,您会发现自己声明了像 $i_for_looping_over_array1 = 0; 这样的变量
好吧,这可能有点极端,但无论如何你最终都会对你的 var 进行伪命名空间,那么为什么不使用 proper 命名空间、作用域、类等呢?
使用global 关键字很慢
每当您在函数中使用global 关键字时,您实际上是在说:寻找一个名为$someName 的变量,它可以在任何地方。将相同的变量作为参数传递,就是告诉函数use this。
当传递一个对象时,您实际上传递的是对该对象的引用(即它的地址),因此不需要查找。基元被复制,因此也没有查找。
把自己想象成一个调酒师。你更愿意在哪里工作? Pub AllIsGlobalHere,在那里,你的第一天,你的老板说:“如果客户要求什么,瓶子可以在任何地方,地窖、地板或右上角的橱柜”,或 Pub CheckTheArguments。后者是您直接进入的地方,当客户要啤酒时,您的老板和/或客户会很有帮助地指出您应该参考哪个草案。