您好,登錄后才能下訂單哦!
這篇“PHP函數及作用域的知識點有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“PHP函數及作用域的知識點有哪些”文章吧。
函數:function,是一種語法結構,將實現某一個功能的代碼塊(多行代碼)封裝到一個結構中,從而實現代碼的重復利用(復用)。
函數有幾個對應的關鍵點:function關鍵字、函數名、參數(形參和實參)、函數體和返回值。
基本語法如下:
Function 函數名([參數]){ //函數體,基本上所有的代碼都可以實現,定義變量、定義常量、使用流程控制(分支、循環)、可以調用函數。 //返回值:return 結果; }
定義函數的目的:是為了實現代碼的重復利用,一個功能一個函數(簡單明了)。
函數是在代碼執行階段,碰到函數名字的時候才會調用,不是在編譯階段。函數的調用特點:只要系統在內存中能夠找到對應的函數,就可以執行(函數的調用可以在函數定義之前)
函數執行的內存分析:
讀取代碼進入到代碼段(編譯:將代碼變成字節碼存儲到內存)
根據代碼逐行執行——編譯和執行是分開的(先編譯后執行)
命名規范:由字母、數字和下劃線組成,但是不能以數字開頭。函數作為一種常用的結構,一般遵循以下規則:函數通常名字代表著函數的功能,而有些功能會比較復雜,可能一個單詞不足以表達,需要多個組合。
駝峰法:除了左邊第一個單詞外,后面所有的單詞首字母都大寫:showParentInfo()
劃線法:單詞之間通過下劃線連接,單詞都是小寫:show_parent_info()
形參:形式參數,不具有實際意義的參數,是在函數定義時使用的參數。
實參:實際參數,具有實際意義的參數,是在函數調用時使用的參數。
兩者關系:形參是實參的載體:實參在調用時通常是需要傳入到函數內部參與計算(運算),那么需要在函數內部去找到實際數據所在的位置才能找到數據本身:需要實際調用的時候,將數據以實參的形式傳遞給形參:給形參賦值,從而使得函數內部可以用到外部數據。
<h4>函數參數形參和實參</h4> <?php header("Content-type:text/html;charset=gbk"); //定義函數 function jia($a,$b){ //形參可以有多個,逗號,隔開 echo $a + $b;//函數體使用形參運算 }; $num = 10;//定義實參 jia($num,2);//傳入實參,實參可以是變量、常量、運算結果等 ?>
在PHP中允許實參多余形參(個數):函數內部不用而已
在PHP中理論上形參個數沒有限制(實際開發不會太多)
實參不能少于形參個數。
默認值:default value,指的是形參的默認值,在函數定義的時候,就給形參進行一個初始賦值:如果實際調用傳入的參數(實參)沒有提供,那么形參就會使用定義時的值來進入函數內部參與運算。通常默認值是用在一些,一定會有某個數據參與,但是可能通常是某個我們知道的值。
<h4>形參默認值</h4> <?php header("Content-type:text/html;charset=gbk"); $a = 10;//定義實參 //定義函數 function jia($a = 6,$b = 4){ //此時$a是實參,編譯不執行,屬于jia函數內部,跟外面的$a=10不沖突。 echo $a + $b;//10 + 4 = 14 }; jia($a);//調用$a,有傳參就是10,$b是4,所以值就是14 echo "<hr/>"; echo $a;//10 ?>
注意:默認值的定義是放在最右邊的(多個),不能左邊形參有默認值,但是右邊沒有函數外部定義的變量名字與函數定義的形參名字沖突(同名)是沒有任何關聯關系的;如果多個函數使用同樣的形參名字也不沖突。
實參在調用時會將值賦值給形參,那么實際上使用的方式就是一種簡單的值傳遞:將實參(如果是變量或者常量或者其他表達式)的結果(值)取出來賦值給形參:形參與外部實際傳入的參數本身沒有任何關聯關系:只是結果一樣。有的時候,希望在函數內部拿到的外部數據,能夠在函數內部改變,那么就需要明確告知函數(定義時),函數才會在調用的時候去主動獲取外部數據的內存地址。以上這種定義形式參數的方式叫作引用傳值。
基本定義語法:
Function 函數名(形參1,&形參2){
//函數體
}
<h4>引用傳遞</h4> <?php header("Content-type:text/html;charset=gbk"); function xiao($x,&$y){ //定義函數xiao() $x = $x * $x; $y = $y * $y; //修改兩個形參的值 echo $x;echo "<hr>";echo $y,"<hr>"; }; $x = 4;$y = 2;//定義變量 xiao($x,$y); echo $x,"<hr>",$y,"<hr>"; ?>
思考:兩者對比,為什么第二個y變成了4?
參考:php——三篇夯實根基第一篇_xiaochuhe.的博客-CSDN博客里面的變量引用賦值。
注意:引用傳值注意事項:在傳入實參的時候,必須傳入變量!!!
返回值:return,指的是將函數實現的結果,通過return關鍵字,返回給函數外部(函數調用處):在PHP中所有的函數都有返回值。(如果沒有明確return使用,那么系統默認返回NULL。
<h4>函數返回值</h4> <?php header("Content-type:text/html;charset=gbk"); function chuhe(){//定義函數 echo __FUNCTION__;echo '<hr/>';//輸出當前函數的名稱 echo __FILE__;echo '<hr/>';//輸出當前文件名的絕對路徑 }; //chuhe();echo '<hr>'; var_dump(chuhe());
返回值作用:將計算結果返回給調用處,并且函數的返回值可以是任意數據類型。
<h4>函數返回值——Retrun</h4> <?php header("Content-type:text/html;charset=gbk"); function jia($x,$y){ return $x + $y;//return直接結束jia函數 echo $x; //注意,此時echo函數不執行 }; $num =jia(4,5);//9 echo $num;
return在函數內部存在的價值:返回當前函數的結果(當前函數運行結束)
return還可以在文件中直接使用(不在函數里面):代表文件將結果return后面跟的內容,轉交給包含當前文件的位置。(通常在系統配置文件中使用較多),在文件中也代表中終止文件后面的代碼:return之后的內容不會執行。
作用域:變量(常量)能夠被訪問的區域
變量可以在普通代碼中定義
變量也可以在函數內部定義
作用域分類:
全局變量
局部變量
超全局變量
全局變量:就是用戶普通定義的變量(函數外部定義)
所屬全局空間:在PHP中只允許在全局空間使用:理論上函數內部不可方法
腳本周期:直到腳本運行結束(最后一行代碼執行完)
<h4>全局變量</h4> <?php header("Content-type:text/html;charset=gbk"); $global = "這是全局變量!"; //定義變量 function chuhe(){ $inner = __FILE__;//局部變量 echo $global; //肯定是報錯的,函數內部肯定是訪問不了全局變量滴 }; chuhe();//調用函數
局部變量:就是在函數內部定義的變量
所屬當前函數空間:在PHP中只允許在當前函數自己內部使用
函數周期:函數執行結束(函數是在棧區中開辟獨立內存空間運行)
<h4>局部變量</h4> <?php header("Content-type:text/html;charset=gbk"); $global = "這是全局變量!"; //定義變量 function chuhe(){ $inner = __FILE__;//局部變量 //echo $global; //肯定是報錯的,函數內部肯定是訪問不了全局變量滴 }; chuhe();//調用函數 echo $inner;//訪問局部變量,也是報錯的
超全局變量:系統定義的變量(預定義變量:$_SERVER、$_POST等)
所屬超全局空間:沒有訪問限制(函數內外都可以訪問)
超全局變量會將全局變量自動納入到$GLOBALS里面,而$GLOBALS沒有作用域限制,所以能夠幫助局部去訪問全局變量:但是必須使用數組方式。
<h4>超全局變量</h4> <?php header("Content-type:text/html;charset=gbk"); $global = "這是全局變量!"; //定義變量 function chuhe(){ $inner = __FILE__;//局部變量 echo $GLOBALS['global'];//講全局變量納入$GLOBALS里面 }; chuhe();//調用函數
<h4>超全局變量</h4> <?php header("Content-type:text/html;charset=gbk"); $global = "這是全局變量!"; //定義變量 function chuhe(){ global $inner; //定義變量,使用全局變量。 $inner = __FILE__;//局部變量 }; chuhe();echo $inner;//調用函數,并訪問局部變量
靜態變量:static,是在函數內部定義的變量,使用static關鍵字修飾,用來實現跨函數共享數據的變量:函數運行結束所有局部變量都會清空,如果重新運行一下函數,所有的局部變量又會重新初始化。
基本語法:
Function 函數名(){
//定義變量
Static $變量名 = 值; //通常會在定義的時候就直接賦值
}
<h4>靜態變量</h4> <?php header("Content-type:text/html;charset=gbk"); function xiao(){ $a = 2;//定義變量 static $b = 3;//定義靜態變量 echo $a++;echo "<hr>"; echo $b++;echo "<hr>"; }; xiao();//調用函數 xiao();//再調一次 xiao();//再調一次
靜態變量的作用是為了跨函數共享數據(同一個函數被多次調用) 。
當前有一個變量所保存到值,剛好是一個函數的名字,那么就可以使用變量+()來充當函數名使用。
<h4>可變函數</h4> <?php header("Content-type:text/html;charset=gbk"); function chu(){ echo __FILE__;echo __FUNCTION__;echo __LINE__; } $xiao = "chu";//定義變量 $xiao();//調用可用函數
附加思考:
<h4>可變函數</h4> <?php header("Content-type:text/html;charset=gbk"); function xiao($a,$b){ //假設定義系統函數 $b = $b + 6; return $a($b);//chuhe(16) } function chuhe($c){ return $c * $c * $c; //定義一個用戶函數,求該函數的3次方 } echo xiao('chuhe',10);//16*16*16 echo "<br>","懵了吧,多想想就懂了!"; //懵了吧,多想想就懂了!!
沒有名字的函數,變量保存匿名函數,本質得到的是一個對象(Closure)。
<h4>函數</h4> <?php header("Content-type:text/html;charset=gbk"); $xiaofeng = function(){ //定義匿名函數 echo "我是蕭風!"; }; $xiaofeng();echo "<hr>";//調用匿名函數 var_dump($xiaofeng);//查案變量類型及內容
閉包:closure, 一詞來源于以下兩者的結合:要執行的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環境(作用域)簡單理解:函數內部有一些局部變量(要執行的代碼塊)在函數執行之后沒有被釋放,是因為在函數內部還有對應的函數在引用(函數的內部函數:匿名函數)
<h4>閉包函數</h4> <?php header("Content-type:text/html;charset=gbk"); function xiaofeng(){ $inner = __FILE__;//定義局部變量 #定義匿名函數 $chuhe = function() use($inner){//用use講局部變量保留給內部使用閉包 echo $inner; }; $chuhe();//調用函數 } xiaofeng();
思考:函數使用完后局部變量有沒有被釋放?
<h4>閉包函數</h4> <?php header("Content-type:text/html;charset=gbk"); function xiaofeng(){ $inner = __FILE__;//定義局部變量 #定義匿名函數 $chuhe = function() use($inner){//用use講局部變量保留給內部使用閉包 echo $inner; }; return $chuhe();//返回內部匿名函數 } $closure = xiaofeng();//理論上局部變量inner已經釋放了 $closure();
偽類型:假類型,實際上在PHP中不存在的類型。但是通過偽類型可以幫助程序員去更好的查看操作手冊從而更方便學習。
偽類型主要有兩種:在三大類八小類之外
Mixed:混合的,可以是多種PHP中的數據類型
Number:數值的,可以是任意數值類型(整形和浮點型)
print():類似于echo輸出提供的內容,本質是一種結構(不是函數),返回1,可以不需要使用括號
print_r():類似于var_dump,但是比var_dump簡單,不會輸出數據的類型,只會輸出值(數組打印使用比較多)
date():按照指定格式對對應的時間戳(從1970年格林威治時間開始計算的秒數),如果沒有指定特定的時間戳,那么就是默認解釋當前時間戳
time():獲取當前時間對應的時間戳
microtime():獲取微秒級別的時間
Strtotime():按照規定格式的字符串轉換成時間戳
<h4>時間函數</h4> <?php header("Content-type:text/html;charset=gbk"); echo date('Y 年 m 月 d 日 H:i:s',987654321);echo "<hr>"; echo time();echo "<hr>"; echo microtime();echo "<hr>"; echo strtotime(" 10 hours");
max():指定參數中最大的值
min():比較兩個數中較小的值
rand():得到一個隨機數,指定區間的隨機整數
mt_rand():與rand一樣,只是底層結構不一樣,效率比rand高(建議使用)
round():四舍五入
ceil():向上取整
floor():向下取整
pow():求指定數字的指定指數次結果:pow(2,8) == 2^8 == 256
abs():絕對值
sqrt():求平方根
function_exists():判斷指定的函數名字是否在內存中存在(幫助用戶不去使用一個不存在的函數,讓代碼安全性更高)
func_get_arg():在自定義函數中去獲取指定數值對應的參數
func_get_args():在自定義函數中獲取所有的參數(數組)
func_num_args():獲取當前自定義函數的參數數量
<h4>自定義函數</h4> <?php header("Content-type:text/html;charset=gbk"); echo "<pre>"; function xiao($a,$b){ print_r(func_get_arg(1));echo "<hr>";//獲取指定參數 print_r(func_get_args());echo "<hr>";//獲取所有參數 print_r(func_num_args());;echo "<hr>";//獲取參數數量 } xiao(1,2);//調用函數 echo "<br>"; function_exists('xiao') && xiao(1,'2');//在調用函數時,判斷指定的函數名字是否在內存中存在(幫助用戶不去使用一個不存在的函數,讓代碼安全性更高)
以上就是關于“PHP函數及作用域的知識點有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。