PHP 學習紀錄(四):PHP函數
PHP函數
1.函數概念
PHP函數其實是具有複雜邏輯的代碼塊,而這種代碼塊通常可以在很多地方重複使用
函數是使用了一種特殊的結構將要重複使用的代碼進行包裹,後期可以透過定義函數的名字來直接實現重複代碼塊的調用
(1)函數結構
函數是一種特殊的結構,包含多個要素:function關鍵字、自定義函數名、參數結構、函數體、返回值
- function關鍵字:PHP內置的一種關鍵字,用來申明結構的體質
- 自定義函數名:緊跟function關鍵字,是一種見名知意的字符串,命名方式同變量
- 參數結構:從外部對內部函數進行調整的機制(數據輸入),分為形參(定義結構時使用的變數)、實參(調用函數時傳入的實際數據),可以沒有參數
- 函數體:函數的核心邏輯部分,用來實現某個功能的具體代碼
- 返回值:return + 數據,將函數得到的結果對外返回,誰調用就返回給誰,可以沒有返回值
(2)函數基礎語法
<?php function 函數名稱(形參列表){ //該函數沒有參數 echo 'hello world!'; //該函數沒有返回值 } ?>
(3)函數調用
透過找到函數對應的內存地址(函數名尋找),實現內部代碼的執行,調用方法為使用 函數名稱+() 的形式實現
(4)函數內存原理
- 函數不會自動執行,必須被調用才會執行函數內部的代碼塊
- 函數是一種結構,PHP會先編譯結構加載到內存,然後才會從第一行開始執行代碼
- 函數定義與調用沒有順序關係(PHP特性)
- 函數是在棧中開闢內存運行
- 函數運行結束後,會自動釋放函數所占用的所有內存
2.參數說明
(1)參數種類
參數分為:形式參數(形餐)、實際參數(實參)
形參:定義結構時使育的虛擬數據(不代表任何真實數據)
實參:調用函數時傳入的實際參數(外部傳入主導數據運行的實際數據)
(2)形參與實參的關係與工作原理
形參:是一種形式,用來保存函數調用時,外部出來的實際數據在函數內部運行的變量
實參:是一種數據,可以是數據值,也可以是變量代表的數據
工作原理:實參再調用函數時,將數據或變量代表的數據傳給形參,函數運行一旦結束,內部的形參所代表的實際數據就會消失
(3)設定形參後就必須傳入實參,否則會報錯
3.參數默認值
函數在定義的時候,發現有些參數外部可變,但不需要經常改變,可以對形參指定一個對應的數據
這樣用戶在調用的時候,即便不給對應的形參傳遞實參,形參也會有數據去支持函數運行
(1)函數參數默認值的指定方式
就是在定義的時候給形參一個默認值
<?php //定義函數,輸出數值的平方 function square($n =1){ echo $n ** 2; //**代表指數 } ?>
(2)默認值的使用
如果再調用函數的時候指定了對應的參數,那麼系統會使用用戶傳入的參數
如果用戶沒有傳遞參數,系統才會使用默認參數
(3)默認值注意事項
函數形參可以沒有默認值,也可以有多個默認值
函數有默認值則必須定義在所有參數的最後
4.參數傳值的方式
參數傳值是指函數在調用的時候,實參是如何傳遞給形參的。
傳值方式是在函數定義的時候決定,默認傳值方式為值傳遞。
(1)函數參數傳值方式
- 值傳遞:將變量的值傳給形參
- 引用傳值:將實參的內存地址傳遞給形參,兩個變量指向同一個地址
- &為地址符號,表示獲取的是參數的地址
- 值傳遞不會改變外部變量本身
- 引用傳遞則因為指向同一個地址,所以內部變量修改影響外部變量
5.函數體
函數體就是函數結構內,{}所包含的所有代碼,包括業務邏輯實現代碼和返回值代碼
(1)函數體可以使用的代碼與結構
函數體可以:
- 定義變量保存數據
- 使用分支結構進行邏輯判斷
- 使用循環實現數據迭代
- 調用函數(與外部調用函數一樣)
- 定義函數(匿名函數)
- 調用類(高級)
(2)函數體用途
函數的本質是為了解決特定問題
函數體要實現的功能:解決問題(通常不要太大)
大問題透過調用小問題解決方案(函數)來實現解決,才能最大實現代碼的復用
6.函數返回值
函數返回值是函數內部運算返回的結果,使用return形式返回,可以沒有返回值,是因為默認返回為NULL
(1)一定有返回值
函數一定有返回值,如果用戶指定就會返回結果,否則返回NULL
(2)接收返回值
返回值是返回到函數調用出,因此可以透過變量來接收函數的返回值
(3)return 關鍵字功能
return擁有多個功能:
在函數內部使用 return + 數據 ,可以返回數據結果
在函數內部使用 return 代表函數執行到這行結束
return 可以代表文檔返回值
7.靜態變量
在函數內部使用 static 關鍵字修飾的變量,只在函數第一次調用的時候執行,只執行一次
再次調用函數的時候則會跳過這行(不會再次執行)
(1)基本語法
使用static修飾變量,通常靜態變量都會在定義的時候初始化
<?php function getStatic(){ static $c = 0;//靜態變量 $var = 0; //普通變量 } ?>
(2)靜態變量與普通變量的區別
靜態變量初始化的那行只會執行一次
<?php function getStatic(){ static $c = 0;//靜態變量 $var = 0; //普通變量 echo $c++,$var++; //輸出後才增加一 } //調用 getStatic(); // 0,0 getStatic(); //1,0 再次調用的時候,靜態變量不會初始化為0,普通變量則會初始化為0 ?>
(3)靜態變量的作用範圍
雖然靜態變量允許跨函數共享數據,但靜態變量只允許在當前函數內部使用,其他地方則用不了
8.作用域
作用域指的是變量所定義的環境決定能夠被訪問的工作區域
分為三種:全局作用域、局部作用域、超全局作用域
(1)全局作用域
用戶自定義全局變量,但是是在函數外部定義的變量,全局作用域能夠在函數外部任何地方使用
生命週期是從定義道腳本執行結束
(2)局部作用域
用戶在函數內部定義局部變量,只能在函數內部進行訪問,函數外部不能訪問
生命週期是函數運行時
(3)超全局作用域
能夠在PHP腳本中的任何地方使用,包含函數內部,是系統定義的超全局變量,生命週期是腳本週期
<?php $a = 100; //全局變量,在全局作用域中可以訪問 $_GET['age'] = 1; //超全局變量:借助系統變量$_GET function display(){ echo $a;//錯誤:系統提示該變量未定義 echo $_GET['age']; //能夠訪問 } ?>
(4)局部作用域訪問全局變量的方法:
- 所有用戶定義的全局變量放到$_GLOBALS中,而$_GLOBALS是一個超全局變量,可以在任何地方訪問
- 透過函數的參數將外部變量傳遞到函數內部,如果想要在函數內部訪問且改變的話,可以採用引傳值
- 使用global關鍵字在函數內部引入:global是一個全局引用/定義變量,引入全局變量需在外部有同名變量
(5)函數內部定義的局部變量要在外部全局作用域訪問的方法:
- 引用傳值:內部能訪問外部,外部也能訪問內部
- 使用global關鍵字:global關鍵字的特性是如果全局作用域存在同名變量則引入,否則創建一個對應的全局變量
9.PHP強制類型
在數據進行操作前就明確數據必須是某種指定形式,格式不符合就會報錯
PHP7的強制類型分為兩種:強類型參數、強類型返回值
(1)強類型參數
在函數定義給定形參的時候,根據函數功能的需求,強制要求參數是對應的類型
(2)強類型返回值
在定義函數結構的時候,指定返回值的類型
<?php $a = 1; $b = 2; function getfloat(int $a, int $b):float{ return $a + $b; } vat_dump(getfloat($a,$b)); //float(3) ?>
(3)嚴格模式
在進行強制類型的時候會在頂格寫上一行代碼:declare(strict_types = 1);,表示使用強制類型
但實際使用的不多,即便沒有這句也不影響強制類型的使用
10.可變函數
函數的名字具有不確定性,是透過變量來保存函數的名字,也是透過變量+()來實現函數的訪問
(1)基本語法
在定義函數結構的時候,指定返回值的類型
<?php //定義函數 function display(){ echo "hello"; } //定義一個變量,保存一個字符串與函數名同名 $var = 'display'; $var(); //var代表display,與()結合,所以運行display()函數 ?>
留言列表