全局变量与局部变量

Jam*_*uld 6 php variables global local

好吧,我不确定我是否正确理解这个概念(我正在学习PHP).如果我理解正确:全局变量可以在同一文档中的任何位置引用,也可以在与"include"链接的文档中引用.局部变量只能在它们所在的函数中引用.

好的,如果我理解正确(这是我发布的原因的一半,以确保我有这个权利)是否真的需要局部变量?我的意思是,如果每个用户都定义了他们自己的变量并且他们需要全部保存,我可以看到它有用......那种?但是,使用数据库会更简单,我想.我想在什么情况下使用局部变量?

Eli*_*gem 9

你问的问题是正确的,直到你要求需要局部变量.总的来说,你应该尽可能地避免全局变量.

我编写一些工具/ 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的代码是一个更糟糕的事情.

Globals(全球范围内的变种)会造成混乱的代码,因为当你试图避免名称冲突时,你会发现你自己宣称像vars一样 $i_for_looping_over_array1 = 0;

好吧,这可能有点极端,但无论如何你最终会伪造你的vars,所以为什么不使用适当的命名空间,范​​围,类等?

使用global关键字很慢

每当你global在函数中使用关键字时,你就会有效地说:寻找一个叫做的变量$someName,它可以在任何地方.将相同的变量作为参数传递,告诉函数使用它.

传递对象时,实际上是在传递对该对象的引用(即其地址),因此不需要查找.原始文件被复制,因此也没有查找.

把自己想象成一个调酒师.你宁愿在哪里工作?Pub AllIsGlobalHere,在你的第一天,你的老板说:"如果顾客要求什么,瓶子可以在任何地方,酒窖,地板或右上方的橱柜",或Pub CheckTheArguments.后者是您直接进入的地方,当客户要求啤酒时,您的老板和/或客户会帮助指出您应该参考哪个草稿.