每天學點電腦知識趣味編程系列之變數作用域
上一期的趣味編程我們講了變數,這一期,我們要講變數的作用域。什麼是作用域呢?簡單通俗的講,就是變數可以用在什麼地方,它的使用範圍。打個比方,就像我們數學中,第一題的x、y在第二題中就不能用了,第一題的x、y的值只能用在第一題,差不多就是這個意思。那麼下面我們就來看看這個作用域。
官方名詞解釋:變數的作用域是腳本中變數可被引用/使用的部分。
作用域分為:局部作用域(local)、全局作用域(global)、靜態作用域(static)、參數作用域(parameter)
一、局部和全局作用域
在所有函數外部定義的變數,擁有全局作用域。除了函數外,全局變數可以被腳本中的任何部分訪問,要在一個函數中訪問一個全局變數,需要使用 global 關鍵字。在 PHP 函數內部聲明的變數是局部變數,僅能在函數內部訪問。簡單通俗的講,全局意思就是到處都可以用,局部意思就是只能在特定的某些地方可以用,下面直接上代碼:
代碼解釋:
1、上圖中的x就是全局變數,擁有全局作用域,意思說在整個文件中的函數以外的地方都可以用,圖中的function myTest() 就是一個函數,function是用來聲明函數用的關鍵字,myTest就是函數名,x在函數裡面不能用,所以在函數裡面使用x會報錯。
2、myTest函數中,聲明了一個變數y,這個變數就是局部變數,擁有局部作用域,它的作用域就是在這個函數範圍內,在函數外,就不能使用了,所以最後一行代碼輸出這個變數y是會報錯的。
下面我們看看程序運行結果:
上圖中,報了4個notice錯誤,也就是警告錯誤,說是在14行中的變數x沒有定義,在25行的變數y沒有定義。因為14行是在函數中使用x,x的作用域是全局的,函數內不能直接調用,所以報錯;25行是在行數外面使用變數 y,y在函數外面沒有定義,只在函數裡面定義了,這是局部變數,所以在函數外面不用使用,所以也報錯了,同時我們可以看到,在行數內使用y,在函數外使用x,都成功輸出了x、y的值。
通過上面的例子,你是否理解了什麼局部和全局作用域了么?
有人會問,那我如果想在函數裡面使用全局變數(全局變數的作用域即為全局作用域)怎麼辦?其實很簡單,只需要使用關鍵字global即可,如圖:
上圖中,我在變數x前面加了關鍵字global,這樣,再在函數裡面輸出變數x,就不會報錯了,也可以正常輸出變數的值5了,運行結果如下:
除了使用global關鍵詞聲明全局變數外,還可以使用超級全局變數$GLOBALS來使用全局變數 x,函數中的變數x可以用 $GLOBALS["x"],也是一樣的效果。
注意:如果在函數內使用關鍵字global或者$GLOBALS,可以通過重新給全局變數賦值來改變全局變數原有的值,單純的使用,不會改變值,如圖:
上圖中,我們在函數中給全局變數x重新賦值100,我們看一下輸出的結果是怎樣的:
從運行結果中可以看出,在函數內,我們給全局變數x賦值成功了,在函數外面輸出x的值也編程100了。
最後,有人會問,函數內部的局部變數如何在函數外使用?這個問題,我可以告訴你,無解,局部變數之所叫局部變數,他的作用域就是局部的。
二、靜態作用域(static)
當一個函數完成時,它的所有變數通常都會被刪除,自動釋放內存。然而,有時候你希望某個局部變數不要被刪除。要做到這一點,請在您第一次聲明變數時使用 static 關鍵字,如圖:
代碼解釋:
1、上圖中變數x使用了關鍵字static,在一次函數運行完結時,不會自動刪除,會保留上一次調用之後的值,在第一次調用之後,我們對變數x進行了自增1,那麼第一次程序運行之後,x會變成1,第二次會變成2,第三次會變成3。
運行結果如下,這裡輸出的是自增之前的值,所以為0,1,2而不是1,2,3。
2、如果不使用static關鍵字,每次調用函數,變數x都會被重新賦值為0,那麼每次運行之後的結果都是1。如圖:
三、參數作用域
參數是通過調用代碼將值傳遞給函數的局部變數(參數也是一種局部變數)。
參數是在參數列表中聲明的,作為函數聲明的一部分
上圖中的x就是參數變數,在聲明函數myTest的時候聲明的,什麼函數時,還可以給參數變數設置默認值,方式為:function myTest($x = 5){},即給參數變數x設置默認值5,調用函數的時候,就可以不傳值了,不傳值就默認為5,傳了就為傳的值。
好了,今天的趣味編程就講解完畢了,你看懂了嗎?看懂了的,在文章下方點個贊!上一期中,我們留了一下問題,變數 x = 5,y = "hello world",問x+y的值是多少?答案是:程序在運行中會報錯,x是整型,y是字元串,整型+字元串沒法加,所以會報錯,如果屏蔽錯誤,得出的結果是:5,變數y自動強轉成0了。是不是很神奇?嘿嘿!給大家推薦一本從0開始學php的書:
下一期,我們將會給大家講解「注釋」,如果你感興趣,請持續關注,更多電腦知識,電腦技術,請關注蟈蟈我的微信公眾號:每天學點電腦知識


TAG:電腦技術 |