PHP代碼 復制代碼 代碼如下: <?php // 例子1 function test_global() { global $var1, $var2; $var2 =& $var1; } function test_globals() { $GLOBALS['var3'] =& $GLOBALS['var1']; } $var1 " /> 午夜插插插,最新亚洲一区二区三区四区 ,亚洲日本在线不卡二区

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP語言中global和$GLOBALS[]的分析 之二

還是借用上一篇的例子:

php代碼
復制代碼 代碼如下:
<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 .”/n”;
test_globals();
print $var3 .”/n”;
?>

執行結果為:
0
5
怎么會這樣呢?不應該是2個5嗎?怎么會出現1個0和1個5呢?

恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
我們都知道變量其實是相應物理內存在代碼中的”代號”而已
引用php手冊的$GLOBALS的解釋:
Global 變量:$GLOBALS,注意: $GLOBALS 在 php 3.0.0 及以后版本中適用。
由所有已定義全局變量組成的數組。變量名就是該數組的索引。這是一個“superglobal”,或者可以描述為自動全局變量。
也就是說上面代碼中的$var1和$GLOBALS['var1']是指的同一變量,而不是2個不同的變量!
下面來分析global到底做了什么?
引用php手冊的global的解釋:
如果在一個函數內部給一個聲明為 global 的變量賦于一個引用,該引用只在函數內部可見??梢酝ㄟ^使用 $GLOBALS 數組避免這一點。
我們都知道php中的函數所產生的變量都是函數的私有變量,那么global關鍵字產生的變量也肯定逃不出這個規則,為什么這么說呢,看下面的代碼:
php代碼
復制代碼 代碼如下:
<?php
// 例子2
function test() {
global $a;
unset($a);
}
$a = 1;
test();
print $a;
?>

執行結果為:
1
為什么會輸出1呢?不是已經把$a給unset了嗎?unset失靈了?php的bug?
都不是,其實unset起作用了,是把test函數中的$a給unset掉了,可以在函數test()中加入
print $a;
來測試!
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的物理內存地址,所以例子1執行過test_global函數以后,變量的變化只在函數的局部產生效應,在函數外部$var2的指向物理內存地址并沒有變化,還是它自己.
此時,就能理解為什么例子1執行完以后,$var2是0,而$var3是5了!
所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在于:
global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量,一但改變了別名變量的指向地址,就會發生一些意料不到情況,例如例子 1.
$GLOBALS[]確確實實調用是外部的變量,函數內外會始終保持一致
可以對照 下面兩個列子再加深下印象:
global:
復制代碼 代碼如下:
<?php
function myfunction(){
global $bar;
unset($bar);
}
$bar=”someting”;
myfunction();
echo $bar;
?>

輸出:someting
$GLOBALS[]:
復制代碼 代碼如下:
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;
?>

輸出:空
當按照上面的思路理解后,碰到下面的情況是不是又有些暈呢?
復制代碼 代碼如下:
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>

輸出將是 “3″。在函數中申明 了全局變量 $a 和 $b,任何變量的所有引用變量都會指向到全局變量。
怎么不是2呢,在函數外部不是不影響嗎,請注意$b在函數中并沒有通過引用修改,而是修改的$b指向物理內存的值,因此外部輸入為3。

php技術PHP語言中global和$GLOBALS[]的分析 之二,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 男生射女生 | 99热只有精品| 国产精品涩涩涩视频网站 | 秋霞伦理高清视频在线 | 精品国产美女AV久久久久 | 成都电影免费中文高清 | 第一精品福利导福航 | 天天躁日日躁狠狠躁中文字幕老牛 | 日本电影免费久久精品 | 回复术士勇者免费观看全集 | 跪趴式啪啪GIF动态图27报 | 回复术士人生重启在线观看 | 撕开美女的衣服2 | 国产成人在线观看网站 | 千禧金瓶梅 快播 | 国产浮力草草影院CCYY | 国产午夜在线精品三级a午夜电影 | 无码日韩人妻精品久久蜜桃入口 | 国产最新进精品视频 | 免费女性裸身照无遮挡网站 | 美女被C污黄网站免费观看 美女白虎穴 | 女配穿书病娇被强啪h | 秘密教学93话恩爱久等了免费 | 校园全肉高h湿一女多男 | 国产精品高清视频在线 | 日韩吃奶摸下AA片免费观看 | 国产呦精品一区二区三区网站 | 中文字幕亚洲乱码熟女在线 | 欧美精品色婷婷五月综合 | 国产精品涩涩涩视频网站 | 69国产精品成人无码视频 | 伊人久久网站 | 98色精品视频在线 | 农民工老头在出租屋嫖老熟女 | 亚洲高清国产拍精品动图 | 一个人看的WWW高清电影 | 一区二区三区内射美女毛片 | 后入式啪gif动态图 后入式狂顶免费视频 | 人妻中文字幕无码久久AV爆 | 中文字幕偷乱免费视频在线 | 岳的奶大又白又胖 |