多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Php入門教程之PHP 變量基本語法

Php入門教程之PHP 變量基本語法

來源:程序員人生   發布時間:2014-02-07 12:35:32 閱讀次數:3771次

變量是php中非常常用的一個東西,所有的操作都要經過變量來傳遞,下面我來給各位同學介紹在php中變量的一些常用用法與關于php變量基礎知識,

具體方法:

PHP變量用于存儲字符、數字、數組甚至對象內容等,以便在我們需要的地方使用.定義一個變量的語法:

$變量名 = 值;

使用變量的例子:

實例代碼如下:

  1.  $var_char = "你好!";  
  2.  echo $var_char;  
  3.  ?> 
執行這段代碼輸出的結果是:

1 你好! 

從這個例子可以看出,變量名以 $ 開始,標明這是一個變量.變量名以字母(a-z、A-Z)或者下劃線 _ 開始,后面可以跟任意字母或數字以及下劃線,但不能是空格.如下這些變量名是有效的:

 $var_char
 $varChar
 $_varChar
 $var_char5

提示:關于變量命名,我們建議變量名以標明其實際語意的組合為佳,如 $my_name 或 $myName 格式.

全局變量global

全局變量便是其中之一,當然這個觀點頗具爭議,有許多人還是建議禁用全局變量,使用不當對造成程序的可讀性很差!結構混亂,調試更是一頭霧水,但是不可否認他的便捷,這便是php為什么會用全局變量global原因吧!…

今天就遇到了php 全局變量不起作用的問題.先上一段簡單的代碼:

實例代碼如下:

  1. $a = 0 ; 
  2. function Test() 
  3.     $a =1; 
  4. Test(); 
  5. echo $a
  6. ?> 

上面的代碼中輸出是0,那是因為函數體Test內$a變量被缺省設置為局部變量,$a的作用域就是在Test內.修改代碼如下:

  1. ?
  2. $a = 0 ; 
  3. function Test() 
  4.    global $a;//申明函數體Test內使用的$a變量為global全局變量 
  5.    $a =1; 
  6. Test(); 
  7. echo $a
  8. ?> 

申明函數體Test內使用的$a變量為global全局變量后,使得$a的作用全局,所以輸出為1.上面的實例只是基本的global全局變量知識,下面我們看看復雜點的:

實例代碼如下:

  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;//申明函數體Sum內使用的$a變量為global全局變量 
  12.    $a =1; 
  13. ?> 

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

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

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

解決方案:

1. 沖出局部函數//A.php 文件

實例代碼如下:

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

2.優秀的訪問器

實例代碼如下:

  1. //A.php 文件 
  2. include 'B.php'
  3. $a =0; 
  4. Set_Global($a); 
  5. echo $a
  6. ?> 
  7. //B.php 文件 
  8. function Set_Global(&$var
  9.     $var=1; 
  10. ?> 

php變量 引用函數 static變量

“無論怎樣聲明變量(按值或按引用),總之在PHP腳本的任何位置都可以聲明變量.但是,聲明的位置會大大影響訪問變量的范圍.這個可訪問的范圍稱為作用域(scope)” –PHP與MySQL程序設計.在了解php變量之前,我們先看看段式內存管理架構的內存段的劃分.通常操作系統會將物理內存劃分為以下幾個邏輯段.

Text-Segment,這個段最大的特點就是只讀.一般存放可執行代碼,也有可能常量也存放在這里,比如字符串常量 BSS-Segment,這里存放了那些沒有初始化的變量.某種意義來講,沒有初始化的變量都是垃圾,不可用 Data-Segment,這里存放了全局變量和靜態變量,直到腳本運行結束,操作系統才會回收這里的內存空間,變量亦會被銷毀.

Stack-Heap Segment 函數參數與本地變量(也稱局部變量)存放在堆中(stack),還有返回值等等.用完了,操作系統就會回收這部分內存空間.對于C程序員而言,可以自行從棧中(heap)申請內存空間,用完了,也需要自己手動釋放. 

作為PHP程序言而言,我們關心的是全局變量、靜態變量、局部變量、函數參數以及函數返回值.局部變量和函數參數基本上一樣,在初始化的時候分配內存空間,退出函數后操作系統會回收內存空間。而全局變量與靜態變量要直php腳本運行結束后,內存空間才會被釋放.與全局變量不同的時,所有靜態變量在程序執行之前就初始化并且分配了內存空間.

注:

1.函數外部聲明靜態變量意義不大,函數內部聲明靜態變量受限于作用域,函數外部不能修改函數內部靜態變量.

2.引用變量,也是變量,只不過它的值是變量的內存地址.

php保留字global和static實例代碼如下:

  1. $i = $j = 8; 
  2. function global_var() { 
  3.    global $j$b
  4.    $c = $j = $b = $i = 4; 
  5. global_var(); 
  6. echo "i:$i, j:$j b:$b c:$c n"//i:8, j:4 b:4 c: 
  7. ?> 

函數外和內都有變量$i,但是他們二個是完全不同的變量.函數外的$i是全局變量,該內存空間直到腳本運行結束后才會被釋放.函數內的$i是局部變量,程序流經過函數的時候,初始化,退出函數的時候,內存被系統回收,再次調用函數,則再次分配內存空間和回收內存空間.二次分配的內存空間有可能是同一內存地址,也有可能不能同一內存地址.

與$i不同的是$j,通過關鍵字global將局部變量”轉為”全局變量.當調用函數global_var()的時候,并不會重新給$j分配內存空間.同樣的,可以在函數外打印$b,卻不能打印$c是因為$b是全局變量,不會被銷毀.而$c則不能打印,$c已經不存在了.在退出函數就給銷毀了.

實例代碼如下:

  1. $a = 2; 
  2. static $b = 2; 
  3. static $c = 3; 
  4. function global_var() { 
  5.     static $i$c
  6.     global $j$a
  7.     $c = $a = $b = $i = $j = 4; 
  8. global_var(); 
  9. echo "a:$a b:$b c:$c i:$i j:$j"//a:4 b:2 c:3 i: j:4 
  10. ?> 

首先,我們看函數外的$b和$c,即是全局變量又是static變量.這里static修飾沒有太大的意義,因為他們都存放在數據段(data-segment),直到腳本運行完了之后才會被回收。然后,我們再看函數里面的$i和$c,函數調用后,$i和$c其實都沒有被回收,但是$i輸出是NULL和$c輸出是3,這是因為他們的作用域是函數內部,不是函數外部,也就是說$i和$c在函數外是不可見的.函數內static變量的意義就在于此:僅函數內部可見且不會被銷毀。也就是說,保證函退出函數,變量也不會被回收,但又不會被其它函數修改.(注:函數外和函數內的$c是二個不同的變量)

實例代碼如下:

  1. function global_var() { 
  2.    static $i
  3.    ++$j
  4.    ++$i
  5.    echo "j:$j i:$i n"
  6. global_var(); //j:1 i:1  
  7. global_var();  //j:1 i:2 
  8. global_var();  //j:1 i:3 
  9. ?> 

上例中,變量$j一直都是1,而$i每調用一次就累加1.這是因為,局部變量存放在堆段,每次退出函數時都會被回收.而$i存放在存放在數據段(data-segment),直到程序執行完畢才會被回收.我們平常說的static變量,如果沒有特別指明,都說的是函數內部的static變量.

引用函數與static變量

既然static變量要直到腳本執行結束,才會被銷毀.那么,有沒有辦法訪問該變量的值呢?我們來看看下面的示例:

實例代碼如下:

  1. get_local_static_var(); 
  2. $ptr = &get_local_static_var(); 
  3. get_local_static_var(); 
  4. ++$ptr
  5. get_local_static_var(); 
  6. what_i($ptr); 
  7. get_local_static_var();  //?? 
  8. what_p($ptr); 
  9. get_local_static_var();  //?? 
  10.  
  11. function &get_local_static_var() { 
  12.     static $i
  13.     ++$i
  14.     echo "i:$i n"
  15.     return $i
  16.  
  17. function what_i($ptr) { 
  18.    $i = &get_local_static_var(); 
  19.    ++$i
  20.    ++$ptr
  21.  
  22. function what_p(&$ptr) { 
  23.    $i = &get_local_static_var(); 
  24.    ++$i
  25.    ++$ptr
  26. ?> 

二個凝問號處,分別輸出是8和12,這就說明了只要變量沒有被銷毀,還是可以被訪問.我們可以通過引用函數將static變量的地址返回其它函數,其它函數則可通過static變量的地址訪問并且修改它的值.

上例第一處??,為什么是8,而不是9.這是因為what_i($ptr)函數,要求參數是按值傳遞,即此處的$ptr實參值是5,且參數$ptr和全局變量$ptr是二個不同的變量.第二處??的值是12,為什么不是11的道理亦是如此.what_p(&$ptr)函數,要求參數是按引用傳遞,即此處的$ptr是指向static變量$i的地址,需要注意的是參數$ptr和全局變量$ptr也是二個不同的變量,只不過他們都指向同一個地方.

drupal應用賞析

drupal定義了一個drupal_static函數,其它函數的static變量都存放在一個數組中,然后對drupal應用到的所有static進行統一管理,比如賦值,重置,刪除等.我覺得,這是一個好辦法.

實例代碼如下:

  1. function &drupal_static($name$default_value = NULL, $reset = FALSE) { 
  2.   static $data = array(), $default = array(); 
  3.   if (!isset($name)) { 
  4.     foreach ($default as $name => $value) { 
  5.       $data[$name] = $value
  6.     } 
  7.     return $data
  8.   } 
  9.   if ($reset) { 
  10.     if (array_key_exists($name$default)) { 
  11.       $data[$name] = $default[$name]; 
  12.     } 
  13.     else { 
  14.       return $data
  15.     } 
  16.   } 
  17.   elseif (!array_key_exists($name$data)) { 
  18.     $default[$name] = $data[$name] = $default_value
  19.   } 
  20.   return $data[$name]; 
  21.  
  22. function ip_address() { 
  23.   $ip_address = &drupal_static(__FUNCTION__); 
  24.  
  25.   if (!isset($ip_address)) { 
  26.     $ip_address = $_SERVER['REMOTE_ADDR']; 
  27.  
  28.     if (variable_get('reverse_proxy', 0)) { 
  29.       if (array_key_exists('HTTP_X_FORWARDED_FOR'$_SERVER)) { 
  30.         $reverse_proxy_addresses = variable_get('reverse_proxy_addresses'array()); 
  31.         if (!emptyempty($reverse_proxy_addresses) && 
  32.      in_array($ip_address$reverse_proxy_addresses, TRUE) 
  33.     ) { 
  34.           $ip_address_parts = explode(','$_SERVER['HTTP_X_FORWARDED_FOR']); 
  35.           $ip_address = trim(array_pop($ip_address_parts)); 
  36.         } 
  37.       } 
  38.       if (array_key_exists('HTTP_X_CLUSTER_CLIENT_IP'$_SERVER)) { 
  39.         $ip_address = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; 
  40.       } 
  41.     } 
  42.   } 
  43.  
  44.   return $ip_address
  45.  
  46. ip_address(); 
  47. //在drupal中很多這樣的應用方式,將其它函數的static變量都存放到一個地方,即drupal_static的data中,然后再統一管理,比如重置等等。 
  48. ?> 

 


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产欧美在线观看不卡一 | 日韩精品欧美一区二区三区 | 性大交 | 免费的黄色的网站 | jux397在线三浦惠理子 | 97成人精品 | 国产尤物在线观看 | 九九精品免视看国产成人 | 又污又黄又无遮挡网站 | 国内精品伊人久久大香线焦 | 波多野结衣福利视频 | 欧洲乱码专区一区二区三区四区 | 乌克兰xxxx| 国产精品一区二区国产 | jizz成熟丰满中国妇女 | 久久久亚洲欧洲日产国码606 | 2019在线亚洲成年视频网站 | 日韩高清专区 | 国产尤物在线观看 | 在线视频www | 欧美一区二区三区高清不卡tv | 男女视频免费 | 日韩乱码中文字幕视频 | 操日本护士 | 日本护士做xxxxxhd | 亚洲一区综合 | 日韩精品一区二区三区中文精品 | 蜜中蜜3动漫无修在线播放 免费 黄 色 人成 视频 | 91欧美精品综合在线观看 | 亚洲国产精品综合久久一线 | 日韩成人免费aa在线看 | 看v片| 国产精品亚洲精品不卡 | 在线成人tv天堂中文字幕 | 黄大色黄美女精品大毛片 | 精品国产欧美另类一区 | 性欧美video在线播放 | 国产精品久久久久久五月尺 | freexxx性video法国 | xart欧美一区在线播放 | 日本欧美一区二区三区不卡视频 |