php - 全局变量与局部变量

标签 php variables global local

好的,我不确定我是否正确理解了这个概念(我正在学习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();的行,并显示类似“试图调用非对象的方法”之类的内容。
祝您调试顺利! $db在哪里重新分配了?除了逐步筛选代码外,没有其他方法可以知道。
宣布Global的一切就像每天晚上把钱包留在人行道上一样。
它可能仍然是您最后留下的地方,但是它的状态(或值(value))很可能已被其他一些实体/实体(人员或代码)(显着)更改了,这些实体/实体可能已将您的钱包(或变量)用作自己的钱包,很幸福,没意识到您把它留在那里以备将来引用。在编写类或函数时,您是指将这些代码也用作用户的同事。因此,即使它们并不意味着伤害,全局也是意外,等待发生。
顺便说一句,函数参数是局部变量,所以我确定您已经在使用它们,而不知道它。
最好如下定义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的代码是一种可能会写的东西。
全局变量(全局范围内的变量)使代码困惑,当您尝试避免名称冲突时,您将发现自己声明了$i_for_looping_over_array1 = 0;之类的变量
好吧,这可能有点极端,但是无论如何,您最终都将使用伪命名来命名您的var,那么为什么不使用适当的 namespace ,范围,类等呢?
使用global关键字很慢
每当您在函数内使用global关键字时,您实际上就是在说:寻找一个名为$someName的变量,该变量可以在任何地方。传递相同的变量作为参数,就是告诉函数使用此变量。
传递对象时,实际上是传递对该对象的引用(即其地址),因此不需要查找。基元被复制,因此也没有查找。
想想自己是一个调酒师。您想在哪里工作? Pub AllIsGlobalHere,在您的第一天,老板就说:“如果客户要东西,瓶子可以在任何地方,地窖,地板或右上角的橱柜”,或Pub CheckTheArguments。后者是您跳进去的地方,当客户要啤酒时,您的老板和/或客户会帮助您指出应引用的草稿。

关于php - 全局变量与局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17988022/

相关文章:

python - 如果我使用自定义字典作为函数的全局变量,为什么我不能访问内置函数?

php - MySql 性能缓慢

javascript - 使用 javascript 或 jquery 查找用户桌面路径

php - 通过mysql查询检索PHP中的 'œ'字符

python - 变量未记录值的变化

javascript - 返回带有变量名称的值

php - num_rows 总是返回 1

php - 过滤YouTube视频URL

javascript - 帮助理解 javascript 全局消减技术

asp.net - 当用户离开网站(ASPX)时最后调用数据库?