熊艳芬 發表於 2019-5-27 08:51:00

PHP 全局变量

<p><span style="font-family: arial, helvetica, sans-serif"><span style="font-family: arial, helvetica, sans-serif">&nbsp;一直认为PHP的全局变量与C++、Java全局变量类似,直到最近做项目过程中使用的局变量,才发现需要补充学习下这方面的内容。</span></span></p>
<h3><span style="font-family: arial, helvetica, sans-serif">  <span style="color: rgba(128, 128, 0, 1)">一 全局变量的global的定义和使用</span></span></h3>
<div><span style="font-family: arial, helvetica, sans-serif">  最初,我的需求是这样的:</span></div>
<div>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
<span style="color: rgba(128, 0, 128, 1)">$name = "why"<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> changeName(){
    <span style="color: rgba(128, 0, 128, 1)">$name = "what"<span style="color: rgba(0, 0, 0, 1)">;
}<br>changeName();
<span style="color: rgba(0, 0, 255, 1)">echo "my name is " . <span style="color: rgba(128, 0, 128, 1)">$name . "&lt;br/&gt;"<span style="color: rgba(0, 0, 0, 1)">;
?&gt;</span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
</div>
<div>
<p>  执行代码的结果是:my name is why,而不是执行changeName()后显示what。分析原因,这是因为函数体changeName内$name变量被缺省设置为局部变量,$name的作用域就是在changeName内。于是,修改代码,添加全局变量如下:</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
<span style="color: rgba(0, 0, 255, 1)">global <span style="color: rgba(128, 0, 128, 1)">$name<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(128, 0, 128, 1)">$name = "why"<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> changeName(){
    <span style="color: rgba(128, 0, 128, 1)">$name = "what"<span style="color: rgba(0, 0, 0, 1)">;
}<br>changeName();
<span style="color: rgba(0, 0, 255, 1)">echo "my name is " . <span style="color: rgba(128, 0, 128, 1)">$name . "&lt;br/&gt;"<span style="color: rgba(0, 0, 0, 1)">;
?&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>  注意:<span style="font-family: arial, helvetica, sans-serif">不能在用global声明变量的同时给变量赋值。像global $name = "why"的使用方式是错误的。</span></p>
<p>  定义全局变量后执行的结果仍然为my name is why,这个结果让我吃惊。原来,<span style="font-family: arial, helvetica, sans-serif">global的正确用法是:"<span style="color: rgba(255, 0, 0, 1)">在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。" 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。那么,再次修改代码:</span></span></p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
<span style="color: rgba(128, 0, 128, 1)">$name = "why"<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> changeName(){
    <span style="color: rgba(0, 0, 255, 1)">global <span style="color: rgba(128, 0, 128, 1)">$name<span style="color: rgba(0, 0, 0, 1)">;
    <span style="color: rgba(128, 0, 128, 1)">$name = "what"<span style="color: rgba(0, 0, 0, 1)">;
}
changeName();
<span style="color: rgba(0, 0, 255, 1)">echo "my name is " . <span style="color: rgba(128, 0, 128, 1)">$name . "&lt;br/&gt;"<span style="color: rgba(0, 0, 0, 1)">;
?&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>  这次的运行结果是:my name is what,说明<span style="font-family: arial, helvetica, sans-serif">global是起传递参数的作用,而并非使变量的作用域为全局。再看下面的例子:</span></p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
<span style="color: rgba(128, 0, 128, 1)">$name = "why"<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> changeName(){
    <span style="color: rgba(0, 0, 255, 1)">global <span style="color: rgba(128, 0, 128, 1)">$name<span style="color: rgba(0, 0, 0, 1)">;
    <span style="color: rgba(128, 0, 128, 1)">$name = "what"<span style="color: rgba(0, 0, 0, 1)">;
}
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> changeName2(){
    <span style="color: rgba(128, 0, 128, 1)">$name = "where"<span style="color: rgba(0, 0, 0, 1)">;
}
changeName();
changeName2();
<span style="color: rgba(0, 0, 255, 1)">echo "my name is " . <span style="color: rgba(128, 0, 128, 1)">$name . "&lt;br/&gt;"<span style="color: rgba(0, 0, 0, 1)">;
?&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p> <span style="font-family: arial, helvetica, sans-serif"> 执行结果为:my name is what,如果在changeName2()中添加global $name,运行结果则是:my name is where。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif">  <span style="color: rgba(128, 128, 0, 1); font-family: arial, helvetica, sans-serif"><span style="color: rgba(0, 0, 0, 1)">综上,global的作用就相当于传递参数,在函数外部声明的变量,如果在函数内想要使用,就用global来声明该变量,这样就相当于把该变量传递进来了,就可以引用该变量了。</span></span></span></p>
<p><span style="color: rgba(128, 128, 0, 1); font-family: arial, helvetica, sans-serif"><span style="color: rgba(0, 0, 0, 1)">  除了使用global参数定义外,还可以使用超全局变量$GLOBAL:</span></span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
<span style="color: rgba(128, 0, 128, 1)">$name = "why"<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> changeName(){
    <span style="color: rgba(128, 0, 128, 1)">$GLOBALS['name'] = "what"<span style="color: rgba(0, 0, 0, 1)">;
}
changeName();
<span style="color: rgba(0, 0, 255, 1)">echo "my name is " . <span style="color: rgba(128, 0, 128, 1)">$name . "&lt;br/&gt;"<span style="color: rgba(0, 0, 0, 1)">;
?&gt;</span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>&nbsp;</p>
<h3>  <span style="font-family: arial, helvetica, sans-serif; color: rgba(128, 128, 0, 1)">二 global和$GLOBAL</span></h3>
<p><span style="font-family: arial, helvetica, sans-serif; color: rgba(128, 128, 0, 1)"> <span style="color: rgba(0, 0, 0, 1)"> 一个例子:</span></span></p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
<span style="color: rgba(128, 0, 128, 1)">$var1 = 1<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(128, 0, 128, 1)">$var2 = 2<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> test1(){
    <span style="color: rgba(128, 0, 128, 1)">$GLOBALS['var2'] = &amp;<span style="color: rgba(128, 0, 128, 1)">$GLOBALS['var1'<span style="color: rgba(0, 0, 0, 1)">];
}
test1();
<span style="color: rgba(0, 0, 255, 1)">echo <span style="color: rgba(128, 0, 128, 1)">$var2 . "&lt;br /&gt;"<span style="color: rgba(0, 0, 0, 1)">;

<span style="color: rgba(128, 0, 128, 1)">$var3 = 1<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(128, 0, 128, 1)">$var4 = 2<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> test2(){
    <span style="color: rgba(0, 0, 255, 1)">global <span style="color: rgba(128, 0, 128, 1)">$var3,<span style="color: rgba(128, 0, 128, 1)">$var4<span style="color: rgba(0, 0, 0, 1)">;
    <span style="color: rgba(128, 0, 128, 1)">$var4 = &amp;<span style="color: rgba(128, 0, 128, 1)">$var3<span style="color: rgba(0, 0, 0, 1)">;
}
test2();
<span style="color: rgba(0, 0, 255, 1)">echo <span style="color: rgba(128, 0, 128, 1)">$var4 . "&lt;br /&gt;"<span style="color: rgba(0, 0, 0, 1)">;
?&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>  <span style="font-family: arial, helvetica, sans-serif">输出$var2的值为1,$var4的值为2,因为$var3的引用指向了$var4的引用地址。$var4的实际值并没有改变。官方的解释是:$GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针。<span style="font-family: arial, helvetica, sans-serif">意味着$GLOBAL在一个脚本的全部作用域中都可用,在函数或方法中无需执行global $variable<strong class="command">;</strong>&nbsp;就可以访问它们。与所有其他超全局变量不同,<var class="varname"><var class="varname">$GLOBALS</var></var>在PHP中总是可用的。另一个例子:</span></span></p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
<span style="color: rgba(128, 0, 128, 1)">$var1 = 1<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> test1(){
    <span style="color: rgba(0, 0, 255, 1)">unset(<span style="color: rgba(128, 0, 128, 1)">$GLOBALS['var1'<span style="color: rgba(0, 0, 0, 1)">]);
}
test1();
<span style="color: rgba(0, 0, 255, 1)">echo <span style="color: rgba(128, 0, 128, 1)">$var1 . "&lt;br /&gt;"<span style="color: rgba(0, 0, 0, 1)">;

<span style="color: rgba(128, 0, 128, 1)">$var2 = 1<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(0, 0, 255, 1)">function<span style="color: rgba(0, 0, 0, 1)"> test2(){
    <span style="color: rgba(0, 0, 255, 1)">global <span style="color: rgba(128, 0, 128, 1)">$var2<span style="color: rgba(0, 0, 0, 1)">;
    <span style="color: rgba(0, 0, 255, 1)">unset(<span style="color: rgba(128, 0, 128, 1)">$var2<span style="color: rgba(0, 0, 0, 1)">);
}
test2();
<span style="color: rgba(0, 0, 255, 1)">echo <span style="color: rgba(128, 0, 128, 1)">$var2<span style="color: rgba(0, 0, 0, 1)">;
?&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<p>  <span style="font-family: arial, helvetica, sans-serif">输出结果是$var1不存在,而$var2的值为1。这就证明,$var2只是别名引用,本身的值没有受到任何的改变。也就是说global $var其实就是$var = &amp;$GLOBALS['var'],调用外部变量的一个别名而已!</span></p>
</div><br><br>
来源:https://www.cnblogs.com/linqingvoe/p/10928886.html
頁: [1]
查看完整版本: PHP 全局变量