php – 全局变量与局部变量

前端之家收集整理的这篇文章主要介绍了php – 全局变量与局部变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好吧,我不确定我是否正确理解这个概念(我正在学习 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');

这将显示一个错误,指向返回$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.后者是您直接进入的地方,当客户要求啤酒时,您的老板和/或客户会帮助指出您应该参考哪个草稿.

猜你在找的PHP相关文章