亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP static 靜態變量和屬性方法使用說明

2024-05-04 21:48:02
字體:
來源:轉載
供稿:網友

變量與其它變量明確區別的,下面我來給各位介紹 static 靜態變量和屬性方法及靜態變量的引用與靜態函數的用法,各位有需要了解的同學可參考.

靜態變量:變量范圍的另一個重要特性是靜態變量(static variable),靜態變量僅在局部函數域中存在,但當程序執行離開此作用域時,其值并不丟失,看看下面的例子.

例子 7-4.演示需要靜態變量的例子,代碼如下:

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

本函數沒什么用處,因為每次調用時都會將 $a 的值設為 0 并輸出 "0",將變量加一的 $a++ 沒有作用,因為一旦退出本函數則變量 $a 就不存在了,要寫一個不會丟失本次計數值的計數函數,要將變量 $a 定義為靜態的.

例子 7-5. 使用靜態變量的例子,代碼如下:

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

現在,每次調用 Test() 函數都會輸出 $a 的值并加一.

靜態變量也提供了一種處理遞歸函數的方法,遞歸函數是一種調用自己的函數,寫遞歸函數時要小心,因為可能會無窮遞歸下去,必須確保有充分的方法來中止遞歸,一下這個簡單的函數遞歸計數到 10,使用靜態變量 $count 來判斷何時停止.

例子 7-6,靜態變量與遞歸函數,代碼如下:

  1. <?php 
  2. function Test() 
  3. static $count = 0; 
  4.  
  5. $count++; 
  6. echo $count
  7. if ($count < 10) { 
  8. Test (); 
  9. $count--; 
  10. ?> 

注:靜態變量可以按照上面的例子聲明,如果在聲明中用表達式的結果對其賦值會導致解析錯誤.

例子 7-7.聲明靜態變量,代碼如下:

  1. <?php 
  2. function foo(){ 
  3. static $int = 0; // correct 
  4. static $int = 1+2; // wrong  (as it is an expression) 
  5. static $int = sqrt(121); // wrong  (as it is an expression too) 
  6. $int++; 
  7. echo $int
  8. ?> 

全局和靜態變量的引用

在 Zend 引擎 1 代,驅動了 PHP4,對于變量的 static 和 global 定義是以 references 的方式實現的,例如,在一個函數域內部用 global 語句導入的一個真正的全局變量實際上是建立了一個到全局變量的引用,這有可能導致預料之外的行為,如以下例子所演示的,代碼如下:

  1. <?php 
  2. function test_global_ref() { 
  3. global $obj
  4. $obj = &new stdclass; 
  5.  
  6. function test_global_noref() { 
  7. global $obj
  8. $obj = new stdclass; 
  9.  
  10. test_global_ref(); 
  11. var_dump($obj); 
  12. test_global_noref(); 
  13. var_dump($obj); 
  14. ?>  

執行以上例子會導致如下輸出,代碼如下:

  1. NULL 
  2. object(stdClass)(0) { 

類似的行為也適用于 static 語句,引用并不是靜態地存儲的,代碼如下:

  1. <?php 
  2. function &get_instance_ref() { 
  3. static $obj
  4.  
  5. echo "Static object: "
  6. var_dump($obj); 
  7. if (!isset($obj)) { 
  8. // 將一個引用賦值給靜態變量 
  9. $obj = &new stdclass; 
  10. $obj->property++; 
  11. return $obj
  12.  
  13. function &get_instance_noref() { 
  14. static $obj
  15.  
  16. echo "Static object: "
  17. var_dump($obj); 
  18. if (!isset($obj)) { 
  19. // 將一個對象賦值給靜態變量 
  20. $obj = new stdclass; 
  21. $obj->property++; 
  22. return $obj
  23.  
  24. $obj1 = get_instance_ref(); 
  25. $still_obj1 = get_instance_ref(); 
  26. echo "n"
  27. $obj2 = get_instance_noref(); 
  28. $still_obj2 = get_instance_noref(); 
  29. ?> 

執行以上例子會導致如下輸出:

  1. Static object: NULL 
  2. Static object: NULL 
  3.  
  4. Static object: NULL 
  5. Static object: object(stdClass)(1) { 
  6.   ["property"]=> 
  7.   int(1) 

上例演示了當把一個引用賦值給一個靜態變量時,第二次調用 &get_instance_ref() 函數時其值并沒有被記住.

注:

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

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

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

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

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

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

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

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

代碼如下:

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

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

引用函數與static變量

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品入口免费视| 亚洲最新中文字幕| 久久久免费观看视频| 美女撒尿一区二区三区| 91精品国产综合久久男男| 亚洲日本中文字幕免费在线不卡| 国内精品视频在线| 亚洲xxxxx电影| 91日本在线观看| 91精品视频在线免费观看| 亚洲福利影片在线| 91免费高清视频| 亚洲香蕉在线观看| 日韩一区二区三区在线播放| 日韩黄色在线免费观看| 日韩欧美中文第一页| 欧美亚洲日本网站| 国产精品第3页| 国产做受高潮69| 欧美精品在线第一页| 中文字幕日韩欧美在线| 美女精品视频一区| 久久6免费高清热精品| 亚洲美女av在线| 狠狠躁夜夜躁人人爽天天天天97| 日韩最新中文字幕电影免费看| 91麻豆国产语对白在线观看| 国产精品∨欧美精品v日韩精品| 欧美亚洲在线播放| 色综合视频一区中文字幕| 国产欧美一区二区三区在线| 91人人爽人人爽人人精88v| 国产精品免费视频xxxx| 久久久免费精品| 久久久久久久91| 久久精品亚洲精品| 欧美激情一区二区三区在线视频观看| 欧美激情一二三| 欧美日本中文字幕| 亚洲国产高清高潮精品美女| 日韩av手机在线观看| 久久99精品久久久久久琪琪| 九色精品美女在线| 久99久在线视频| 国产91在线播放精品91| 国产美女精品视频| 精品国产成人在线| 亚洲免费伊人电影在线观看av| 国产精品精品久久久| 国产精品高潮粉嫩av| 精品欧美一区二区三区| 国产精品久久久久久久久久新婚| 亚洲欧洲激情在线| 91精品国产电影| 欧美性xxxxx极品| 成人精品在线观看| 国产97在线播放| 国产精品aaaa| 久久久久女教师免费一区| 欧美贵妇videos办公室| 精品中文字幕在线2019| 一区二区日韩精品| 亚洲福利在线观看| 97超级碰在线看视频免费在线看| 欧美日韩一二三四五区| 国产91成人在在线播放| 欧美另类69精品久久久久9999| 在线视频中文亚洲| 青青草国产精品一区二区| 中文字幕亚洲一区在线观看| 亚洲精品之草原avav久久| 久久久av电影| 亚州欧美日韩中文视频| 久久精品小视频| 精品久久在线播放| 国产一区二区三区网站| 国产精品1234| 日本精品在线视频| 久久久久久久久国产精品| 亚洲一区二区三区在线免费观看| 色偷偷偷亚洲综合网另类| 91精品国产综合久久香蕉最新版| 国产91精品久久久久久| 久久亚洲精品网站| 精品动漫一区二区| 国产成人亚洲综合91| 国产精品视频久久久| 日韩精品视频在线观看免费| 成人黄色在线免费| 日韩av电影在线免费播放| 57pao成人永久免费视频| 国产精品久久久久国产a级| 高跟丝袜欧美一区| 91久久精品在线| 欧美激情亚洲一区| 日韩女优人人人人射在线视频| 欧美亚洲国产精品| 一本色道久久综合狠狠躁篇的优点| 国产精品久久婷婷六月丁香| 色伦专区97中文字幕| 欧美一级黑人aaaaaaa做受| 欧美成年人视频| 美女999久久久精品视频| 亚洲色图第三页| 久久人体大胆视频| 亚洲精品一区av在线播放| 最近2019年中文视频免费在线观看| 欧美另类极品videosbestfree| 亚洲国产精品va在线看黑人动漫| 欧美成人在线免费视频| 日本免费一区二区三区视频观看| 亚洲福利视频免费观看| 国产欧美精品一区二区三区-老狼| 日韩在线视频中文字幕| 国产精品免费久久久久影院| 北条麻妃久久精品| 成人黄色午夜影院| 欧美一区二区大胆人体摄影专业网站| 超在线视频97| 91精品国产高清久久久久久| 日韩电影网在线| 久久久久久国产三级电影| 91精品啪在线观看麻豆免费| 国产精品美女主播在线观看纯欲| 国产日韩精品在线播放| 日韩av中文在线| 亚洲最新视频在线| 日韩成人av网址| 久久久久久12| 亚洲加勒比久久88色综合| 97视频在线观看成人| 日韩经典一区二区三区| 亚洲欧洲自拍偷拍| 国产91精品在线播放| 久久综合九色九九| 欧美激情在线有限公司| 日韩毛片在线观看| 91精品在线影院| 亚洲sss综合天堂久久| 一区二区三区日韩在线| 国产狼人综合免费视频| 精品久久久久久久久久久久久| 琪琪亚洲精品午夜在线| 久久夜色精品国产| 日本在线观看天堂男亚洲| 久久影视电视剧凤归四时歌| 成人黄色短视频在线观看| 亚洲精品欧美极品| 国产精品一区久久| 日本欧美黄网站| 国产一区红桃视频| 国产精品视频大全| 国产精品欧美亚洲777777| 国产精品综合久久久| 在线视频欧美性高潮| 久久99精品久久久久久琪琪| 久久电影一区二区| 日韩经典中文字幕在线观看| 亚洲成人网在线观看| 欧美在线视频导航| 色小说视频一区| 日韩av片免费在线观看| 欧美丝袜一区二区三区| 日韩成人在线免费观看|