日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開源 > php教程 > PHP Global與$GLOBALS變量作用域與區(qū)別

PHP Global與$GLOBALS變量作用域與區(qū)別

來(lái)源:程序員人生   發(fā)布時(shí)間:2013-11-25 13:12:59 閱讀次數(shù):3170次

在php中變量有很多種如普通的變量及全局變量(Global與$GLOBALS),本文章來(lái)給大家介紹在php中Global與$GLOBALS的用法區(qū)別.

Global,全局變量

PHP Global變量在實(shí)際應(yīng)用中會(huì)發(fā)現(xiàn)許多問(wèn)題需要我們不斷的去完善處理.我們?cè)谶@篇文章中就針對(duì)PHP Global變量出現(xiàn)的問(wèn)題給出了一些具體的解決辦法,PHP hack的使用技巧詳解,代碼實(shí)現(xiàn)PHP GTK寫文本查看器,網(wǎng)站開發(fā)中PHP語(yǔ)言優(yōu)缺點(diǎn).

如何正確實(shí)現(xiàn)PHP function函數(shù)擴(kuò)展

PHP error_log()函數(shù)處理錯(cuò)誤日志

1:PHP Global變量的作用是定義全局變量,但是這個(gè)全局變量不是應(yīng)用于整個(gè)網(wǎng)站,而是應(yīng)用于當(dāng)前頁(yè)面,包括include或require的所有文件

實(shí)例代碼如下:

  1. $a=123;  
  2.  
  3. function aa()  
  4. {  
  5. Global $a;   
  6. //如果不把$a定義為global變量 
  7. ,函數(shù)體內(nèi)是不能訪問(wèn)$a的  
  8. echo $a;  
  9. }  
  10. aa(); 

總結(jié):

在函數(shù)體內(nèi)定義的PHP Global變量,函數(shù)體外可以使用,在函數(shù)體外定義的global變量不能在函數(shù)體內(nèi)使用,

實(shí)例代碼如下:

  1. $glpbal $a;   
  2. $a=123;    
  3. function f()   
  4. {   
  5. echo $a//錯(cuò)誤,   
  6. }  

再看看下面一例,實(shí)例代碼如下:

  1. function f()   
  2.  
  3. {   
  4. global $a;  $a=123;   
  5. }    
  6. f();   
  7. echo $a
  8. //正確,可以使用 

2:PHP Global變量問(wèn)題解析:

question:我在config.inc.php中定義了一些變量($a),在別的文件中函數(shù)外部 include("config.inc.php"),函數(shù)內(nèi)部需要使用這些變量$a,如果沒有聲明的話,echo $a是打印不出來(lái)任何東西的.因此聲明global $a,但是有很多函數(shù)和很多變量.總不能不斷重復(fù)的這樣聲明吧?有什么好的解決辦法,請(qǐng)指點(diǎn).

answer1:先在config.inc.php里定義常量:define(常量名,常量值),再在其他需要用到的地方require 'config.inc.php',然后就能在這個(gè)文件里直接使用這個(gè)常量了.

answer2:我也有個(gè)辦法,就是定義數(shù)組,如$x[a],$x,那樣就只要聲明global $x一個(gè)了.

answer3:我試了你的這個(gè)方法,不行啊.

answer4:改你的php.ini文件.

設(shè)置PHP Global變量 為 on,下面我們看看復(fù)雜點(diǎn)的:

實(shí)例代碼如下:

  1. //A.php 文件 
  2. function Test_Global() 
  3.     include 'B.php'
  4.     Test(); 
  5. $a = 0 ; 
  6. Test_Global(); 
  7. echo $a
  8. ?> 
  9. //B.php 文件 
  10. function Test() 
  11.    global $a;//申明函數(shù)體Sum內(nèi)使用的$a變量為global全局變量 
  12.    $a =1; 
  13. ?> 

為什么輸出的卻是0?!!

在用戶自定義函數(shù)中,一個(gè)局部函數(shù)范圍將被引入.任何用于函數(shù)內(nèi)部的變量按缺省情況將被限制在局部函數(shù)范圍內(nèi)(包括include 和 require 導(dǎo)入的文件內(nèi)的變量)!

解釋:A.php文件的內(nèi)Test_Global是定義好的第三方函數(shù),該函數(shù)用include導(dǎo)入了B.php文件內(nèi)的$a的global全局變量,所以$a被限制在Test_Global局部函數(shù)范圍內(nèi),所以B.php文件內(nèi)的$a的作用范圍都在Test_Global內(nèi),而不是作用了整個(gè)A.php內(nèi)….

解決方案:

1. 沖出局部函數(shù)實(shí)例代碼如下:

  1. //A.php 文件 
  2. function Test_Global() 
  3.     Test(); 
  4. include 'B.php'//將include 從局部Test_Global函數(shù)中移出 
  5. $a = 0 ; 
  6. Test_Global(); 
  7. echo $a
  8. ?> 
  9. //B.php 文件 
  10. function Test() 
  11.     global $a
  12.     $a =1; 
  13. ?> 

global和$GLOBALS的區(qū)別

php中g(shù)lobal和$GLOBALS不僅僅是寫法不一樣以為,2者的區(qū)別還是很大的,在實(shí)際應(yīng)用中需要注意!

先看下面的實(shí)例代碼:

  1.  // 例子1 
  2.  function test_global() { 
  3.    global $var1$var2
  4.    $var2 =& $var1
  5.  } 
  6.  function test_globals() { 
  7.    $GLOBALS['var3'] =& $GLOBALS['var1']; 
  8.  } 
  9.  $var1 = 5; 
  10.  $var2 = $var3 = 0; 
  11.  test_global(); 
  12.  print $var2 .”n”; 
  13.  test_globals(); 
  14.  print $var3 .”n”; 
  15.  ?>  

執(zhí)行結(jié)果為:0 5

怎么會(huì)這樣呢?不應(yīng)該是2個(gè)5嗎?怎么會(huì)出現(xiàn)1個(gè)0和1個(gè)5呢?

恩,我們保留以上問(wèn)題,深入分析$GLOBALS和global的原理!我們都知道變量其實(shí)是相應(yīng)物理內(nèi)存在代碼中的”代號(hào)”而已引用php手冊(cè)的$GLOBALS的解釋:

Global 變量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中適用.由所有已定義全局變量組成的數(shù)組.變量名就是該數(shù)組的索引.這是一個(gè)“superglobal”,或者可以描述為自動(dòng)全局變量.也就是說(shuō)上面代碼中的$var1和$GLOBALS['var1']是指的同一變量,而不是2個(gè)不同的變量!下面來(lái)分析global到底做了什么?

引用php手冊(cè)的global的解釋:

如果在一個(gè)函數(shù)內(nèi)部給一個(gè)聲明為 global 的變量賦于一個(gè)引用,該引用只在函數(shù)內(nèi)部可見.可以通過(guò)使用 $GLOBALS 數(shù)組避免這一點(diǎn).我們都知道php中的函數(shù)所產(chǎn)生的變量都是函數(shù)的私有變量,那么global關(guān)鍵字產(chǎn)生的變量也肯定逃不出這個(gè)規(guī)則,為什么這么說(shuō)呢,

請(qǐng)看下面的代碼:

  1.  // 例子2 
  2.  function test() { 
  3.    global $a
  4.    unset($a); 
  5.  } 
  6.  $a = 1; 
  7.  test(); 
  8.  print $a
  9.  ?>  

執(zhí)行結(jié)果為:1

為什么會(huì)輸出1呢?不是已經(jīng)把$a給unset了嗎?unset失靈了?php的bug?

都不是,其實(shí)unset起作用了,是把test函數(shù)中的$a給unset掉了,可以在函數(shù)test()中加入print $a;來(lái)測(cè)試!

接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個(gè)引用賦值運(yùn)算,也就是$var2將指向var1所指向的物理內(nèi)存地址,所以例子1執(zhí)行過(guò)test_global函數(shù)以后,變量的變化只在函數(shù)的局部產(chǎn)生效應(yīng),在函數(shù)外部$var2的指向物理內(nèi)存地址并沒有變化,還是它自己.此時(shí),就能理解為什么例子1執(zhí)行完以后,$var2是0,而$var3是5了!

所以我們得出一個(gè)結(jié)論,在函數(shù)中g(shù)lobal和$GLOBALS[]的區(qū)別在于:

global在函數(shù)產(chǎn)生一個(gè)指向函數(shù)外部變量的別名變量,而不是真正的函數(shù)外部變量,一但改變了別名變量的指向地址,就會(huì)發(fā)生一些意料不到情況,例如例子1.

$GLOBALS[]確確實(shí)實(shí)調(diào)用是外部的變量,函數(shù)內(nèi)外會(huì)始終保持一致,可以對(duì)照下面兩個(gè)列子再加深下印象:

global:

實(shí)例代碼如下:

  1. function myfunction(){ 
  2.     global $bar
  3.     unset($bar); 
  4. $bar=”someting”; 
  5. myfunction(); 
  6. echo $bar
  7. ?> 

輸出:someting

  1. $GLOBALS[]: 
  2.     function foo() 
  3.     unset($GLOBALS['bar']); 
  4. $bar = “something”; 
  5. foo(); 
  6. echo $bar
  7. ?> 

輸出:空

當(dāng)按照上面的思路理解后,碰到下面的情況是不是又有些暈?zāi)?

實(shí)例代碼如下:

  1. $a = 1; 
  2. $b = 2; 
  3. function Sum() 
  4.    global $a$b
  5.    $b = $a + $b
  6. Sum(); 
  7. echo $b
  8. ?> 

輸出將是 “3″.在函數(shù)中申明了全局變量 $a 和 $b,任何變量的所有引用變量都會(huì)指向到全局變量.

怎么不是2呢,在函數(shù)外部不是不影響嗎,請(qǐng)注意$b在函數(shù)中并沒有通過(guò)引用修改,而是修改的$b指向物理內(nèi)存的值,因此外部輸入為3.

php中g(shù)lobal和$GLOBALS不僅僅是寫法不一樣以為,2者的區(qū)別還是很大的,在實(shí)際應(yīng)用中需要注意!

先看下面的PHP代碼例子:

  1.  // 例子1  
  2.  function test_global() {  
  3.    global $var1$var2;  
  4.    $var2 =& $var1;  
  5.  }  
  6.  function test_globals() {  
  7.    $GLOBALS['var3'] =& $GLOBALS['var1'];  
  8.  }  
  9.  $var1 = 5;  
  10.  $var2 = $var3 = 0;  
  11.  test_global();  
  12.  print $var2 .”n”;  
  13.  test_globals();  
  14.  print $var3 .”n”;  
  15.  ?>   

執(zhí)行結(jié)果為:0 5

怎么會(huì)這樣呢?不應(yīng)該是2個(gè)5嗎?怎么會(huì)出現(xiàn)1個(gè)0和1個(gè)5呢?

恩,我們保留以上問(wèn)題,深入分析$GLOBALS和global的原理!我們都知道變量其實(shí)是相應(yīng)物理內(nèi)存在代碼中的“代號(hào)“而已,引用php手冊(cè)的$GLOBALS的解釋:

Global 變量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中適用.

由所有已定義全局變量組成的數(shù)組.變量名就是該數(shù)組的索引.這是一個(gè)“superglobal”,或者可以描述為自動(dòng)全局變量.也就是說(shuō)上面代碼中的$var1和$GLOBALS['var1']是指的同一變量,而不是2個(gè)不同的變量!

下面來(lái)分析global到底做了什么?

引用php手冊(cè)的global的解釋:

如果在一個(gè)函數(shù)內(nèi)部給一個(gè)聲明為 global 的變量賦于一個(gè)引用,該引用只在函數(shù)內(nèi)部可見.可以通過(guò)使用 $GLOBALS 數(shù)組避免這一點(diǎn).我們都知道php中的函數(shù)所產(chǎn)生的變量都是函數(shù)的私有變量,那么global關(guān)鍵字產(chǎn)生的變量也肯定逃不出這個(gè)規(guī)則,為什么這么說(shuō)呢,看下面的代碼:

實(shí)例代碼如下:

  1.  // 例子2  
  2.  function test() {  
  3.    global $a;  
  4.    unset($a);  
  5.  }  
  6.    
  7.  $a = 1;  
  8.  test();  
  9.  print $a;  
  10.  ?>   

執(zhí)行結(jié)果為:1

為什么會(huì)輸出1呢?不是已經(jīng)把$a給unset了嗎?unset失靈了?php的bug?

都不是,其實(shí)unset起作用了,是把test函數(shù)中的$a給unset掉了,可以在函數(shù)test()中加入print $a;來(lái)測(cè)試!

接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個(gè)引用賦值運(yùn)算,也就是$var2將指向var1所指向的物理內(nèi)存地址,所以例子1執(zhí)行過(guò)test_global函數(shù)以后,變量的變化只在函數(shù)的局部產(chǎn)生效應(yīng),在函數(shù)外部$var2的指向物理內(nèi)存地址并沒有變化,還是它自己.

此時(shí),就能理解為什么例子1執(zhí)行完以后,$var2是0,而$var3是5了!

所以我們得出一個(gè)結(jié)論,在函數(shù)中g(shù)lobal和$GLOBALS[]的區(qū)別在于:

global在函數(shù)產(chǎn)生一個(gè)指向函數(shù)外部變量的別名變量,而不是真正的函數(shù)外部變量,一但改變了別名變量的指向地址,就會(huì)發(fā)生一些意料不到情況,例如例子1.

$GLOBALS[]確確實(shí)實(shí)調(diào)用是外部的變量,函數(shù)內(nèi)外會(huì)始終保持一致,可以對(duì)照下面兩個(gè)列子再加深下印象:

global:

實(shí)例代碼如下:

  1. function myfunction(){ 
  2.     global $bar
  3.     unset($bar); 
  4. $bar=”someting”; 
  5. myfunction(); 
  6. echo $bar
  7. ?> 

輸出:someting

實(shí)例代碼如下:

  1. $GLOBALS[]: 
  2.     function foo() 
  3.     unset($GLOBALS['bar']); 
  4. $bar = “something”; 
  5. foo(); 
  6. echo $bar
  7. ?> 

輸出:空

當(dāng)按照上面的思路理解后,碰到下面的情況是不是又有些暈?zāi)?

實(shí)例代碼如下:

  1. $a = 1; 
  2. $b = 2; 
  3. function Sum() 
  4.    global $a$b
  5.    $b = $a + $b
  6. Sum(); 
  7. echo $b
  8. ?> 

輸出將是 “3″.在函數(shù)中申明了全局變量 $a 和 $b,任何變量的所有引用變量都會(huì)指向到全局變量.

怎么不是2呢,在函數(shù)外部不是不影響嗎,請(qǐng)注意$b在函數(shù)中并沒有通過(guò)引用修改,而是修改的$b指向物理內(nèi)存的值,因此外部輸入為3


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 成人免费淫片aa视频免费 | 一级性电影 | 国产在线播放一区 | 国产伦精品一区二区三区在线 | 日韩欧美一卡二卡 | 91伦理电影| av在线网站观看 | 久久骚| 久久国产成人精品av | 在线一区二区三区四区 | 国内毛片毛片 | 成年人在线看片 | 性感美女一级毛片 | 久久免费视频观看 | 人善交videos欧美3d动漫 | 日日夜夜草 | 久久黄网| 日韩不卡在线 | 国产精品久久久影院 | 嫩草影院在线观看视频 | 欧美日韩在线免费 | 欧美亚洲免费 | av免费在线观看网站 | 国产激情 | 国产真实精品久久二三区 | 国产麻豆一区 | 久久久www成人免费精品张筱雨 | 毛片一区| 欧美综合77777色婷婷 | 爱爱小视频日本 | 国产视频黄色 | 视频精品一区二区三区 | 亚洲国产精品一区二区第一页 | 免费日韩一区二区 | 久久久7 | 久久69精品久久久久久久电影好 | 99久在线视频 | 国产一区二区视频在线 | 精品99久久 | 欧美黄色aa| 欧洲精品久久久 |