close

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)函數參數傳值方式

  1. 值傳遞:將變量的值傳給形參
  2. 引用傳值:將實參的內存地址傳遞給形參,兩個變量指向同一個地址
  • &為地址符號,表示獲取的是參數的地址
  • 值傳遞不會改變外部變量本身
  • 引用傳遞則因為指向同一個地址,所以內部變量修改影響外部變量

 

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()函數
?>
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 ivankao 的頭像
    ivankao

    IvanKao的部落格

    ivankao 發表在 痞客邦 留言(0) 人氣()