# :-: 一、函數是什么
* 函數是一段需要重復執行的代碼片斷
* 函數是實現代碼復用的重要手段
* 函數是現代編程語言最重要的基本單元
* 函數永遠是編程的核心工作
*****
# :-: 二、函數的分類
根據函數的提供者(編寫者),分為二類
* 系統函數: 編程語言開發者事先寫好提供給開發者直接使用的
* 自定義函數: 用戶根據自身需求,對系統功能進行擴展,我們又稱為方法
*****
# :-: 三、函數的基本語法
* 語法: `function 函數名(參數列表){函數體}`
* 必須使用關鍵字:`function` 聲明
* 函數名稱必須符合PHP標識符命名規范
* 函數名稱**不區分大小寫**,多個單詞推薦使用下劃線連接
* 函數調用者傳遞給函數的參數必須寫在參數列表中
* 參數列表中的參數必須初始化(即有值)
* 參數列表可以為空
* 函數體可以為空, 也可以由一條或多條語句組成
* 通常函數體會有`return`返回函數執行結果
```php
function func_name(參數列表)
{
//函數體: 由一條或多條語句組成,可以為空
}
```
*****
# :-: 四、函數作用域
* 眾所周知, 作用域是用來查找變量的工具
* php中, 只有函數作用域和全局使用域
* 所以函數作用域中的變量,外部不可見
* 全局作用域聲明變量,在函數中是可見的
*****
# :-: 五、PHP中的函數知識,實例
### 1、函數的常規聲明與調用
```php
// 使用關鍵字function 聲明函數
// 函數名稱必須符合php關于標識符的約定
// 函數需要接收的參數寫到函數名后的一對括號內
function sum(){
// 函數可以有return 語句,將執行結果返回給調用者
return 1+1;
// 如果不有 return 返回 null
}
echo sum();
```
*****
### 2、函數的參數
```php
// 括號內的參數列表, 是形式參數,通常與實參一一對應
// 實參必須被初始化, 可以被實參, 也可以用默認值
function sum($a, $b){
// $c 是函數自已的私有變量, 也叫局部變量,對外不可見
$c = $a + $b;
return $c;
}
// 調用
// 按名稱調用,必須在函數名后面添加一對圓括號
// 將調用參數寫到括號內
// 括號內的參數叫實際參數, 簡稱: 實參
echo sum(10, 20);
// 函數內的私有變量,外部不可訪問
// echo $c;
// echo '<hr>';
```
*****
### 3、函數參數的默認值
```php
function sum($a = 20, $b = 30){
$c = $a + $b;
return $c;
}
echo '<per>';
// 全部賦值,使用自定義的值
echo sum(10, 15), '<br>';
// 只給$a賦值,$b取默認值
echo sum(10), '<br>';
// 全部取默認值
echo sum(), '<br>';
echo '<hr>';
```
*****
### 4、函數不固定參數數量
* func_num_args 獲取實參的數量
* func_get_args 獲取實參的值(數組)
```php
// 一、形參列表只是占位符,可以在函數中獲取調用的實參
function sum1(){
// 獲取實參的數量
$argNum = func_num_args(); // 無參數
echo $argNum;
// 獲取實參組成的數組
$argArr = func_get_args(); // 無參數
print_r($argArr);
// 獲取每一個參數
echo func_get_arg(0); // 第一個實參
echo func_get_arg(1); // 第二個實參
// 1,計算二個數的和
$a = func_get_arg(0);
$b = func_get_arg(1);
return $a + $b;
// 2,使用實參數組來簡化,計算二個數的和
$total = 0;
foreach ($argArr as $value) {
$total += $value;
}
return $total;
// 3,以上數組求和,可以使用數組函數arrya_sum()簡化,計算二個數的和
return array_sum($argArr);
}
echo sum1(10, 20);
echo '<br>';
// 函數內部使用參數循環時可以計算任意數量的數據之和
echo sum1(10, 20, 30, 40, 50);
echo '<hr>';
// 二、php7, 提供了一種可變長參數, 可以替代func_get_args()函數
function sum2(...$params){
// 變長參數的標示 ...
// 將實參全部打包到形參變量$params中
print_r($params);
// 實現上例的累加操作
$total = 0;
foreach ($params as $value) {
$total += $value;
}
return $total;
}
echo sum2(1,2,3,4,5);
echo '<hr>';
// 三、變長參數的一個應用場景
function sum3($a, $b, ...$c){
// $a=1, $b=2, 剩下參數全部打包到數組$c中, $c=[3,4,5,6]
return '$a='.$a.', $b='.$b .'<br>'. print_r($c, true);
}
echo sum3(1,2,3,4,5,6);
echo '<hr>';
// 四、變長的實參
function sum4($a,$b,$c,$d){
return $a+$b+$c+$d;
}
$arr = [6,7,8];
echo sum4(2,...$arr);
echo '<br>';
// $arr 會用... 自動展開, 等價于這樣調用
echo sum4(2,6,7,8);
echo '<hr>';
// 五、php7, 可以對參數類型進行限制
function sum5(int $a,...$arr){
// 限制了參數整數類型, 2.5轉為2, '5' 被強制轉換成整數5
return $a + array_sum($arr);
}
echo sum5(2.5, 3, 4, '5');
```
*****
### 5、函數的返回值
```php
// 1、return 返回值
function demo1(){
// 可以使用返回語句: return 返回執行結果
return 'Hello PHP';
}
echo demo1();
echo '<hr>';
// 2、如果沒有return , 默認返回 null
function demo2(){
}
// 檢測返回值的類型
echo is_null(demo2()) ? '返回NULL' : '沒有返回NULL';
echo '<hr>';
// 3、函數不允許返回多個值
function demo3(){
$a = 10;
$b = 20;
// return 返回多個值報錯
return $a,$b;
}
echo demo3();
// 4、函數返回多個值,用數組返回
function demo4(){
$a = 10;
$b = 20;
return [$a, $b];
}
echo '<pre>' . print_r(demo4(),true);
// 5、php7中, 可以限定函數的返回類型
function demo5($a, $b) :int{
return $a + $b;
}
// 不限定返回類型,輸出: 4.7, 限定后返回: 4
echo demo5(1.4, 3.3);
```
*****
### 6、函數中的變量訪問
```php
// 1、函數中的變量訪問
$site = 'www.php.cn';
function demo1(){
// 函數中不能直接訪問外部變量
return $site;
}
echo demo1();
echo '<hr>';
// 2、函數中的全局變量訪問
$site = 'www.php.cn';
function demo2(){
// 在函數中使用global關鍵字聲明一下$site是一個全局變量
// 這樣, 函數中就可識別出這個$site變量
global $site;
// 函數中不能直接訪問外部變量
return $site;
}
echo '<per>';
echo demo2();
echo '<hr>';
// 3、函數外部聲明的變量,會自動成為超全局變量數組$GLOBALS的成員
$site = 'www.php.cn';
echo $GLOBALS['site'];
echo '<hr>';
function demo3(){
// 超全局變量不受作用域限制,可以在腳本的任何地方使用,當然也包括函數內
return $GLOBALS['site'];
}
echo demo3();
// 4、常量也不受作用域的限制,可以在腳本的任何地方使用
// 所謂常量,可以理解為只讀變量, 一經定義不允許更新或刪除
define('SITE_NAME', 'PHP中文網');
function demo4(){
return SITE_NAME;
}
echo demo4();
// 5、外部如何訪問函數的私有變量
function demo5(){
$email = 'ouyangke@php.cn';
// 通過return 返回私有變量到外部調用者
return $email;
}
echo demo5();
```
*****
### 7、匿名函數與閉包
* 官網解釋:
* 匿名函數(Anonymous functions),也叫閉包函數(closures)
* 允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。
* 當然,也有其它應用的情況。匿名函數目前是通過 Closure 類來實現的。
```php
// 1、匿名函數, 做為值來使用
$sum = function ($a, $b) {
return $a + $b;
};
echo $sum(5,6);
// 2、匿名函數: 做為回調參數來使用
$arr = [3,1,6,2,9];
usort($arr, function ($a, $b){
// >0, 由小到大
// =0, 相等
// <0, 由大到小
return $a - $b; // asc
// return $b - $a; // desc
});
print_r($arr);
// 3、php7中, 對于這類比較運算, 有一個更簡潔的語法:太空船操作符
$arr = [3,1,6,2,9];
usort($arr, function ($a, $b){
return $a <=> $b;
return $b <=> $a;
});
print_r($arr);
// 4、獲取父作用域中的變量
$name = '歐陽克';
$f1 = function (){
// 直接獲取外部變量,是取不到的
return $name;
};
echo $f1();
// 5、獲取父作用域中的變量
$name = '歐陽克';
$f2 = function() use ($email) {
return $email;
};
echo $f2();
// 6、大多數情況下, 我們會在閉包函數中對外部變量進行更新
// 這時可以將外部變量以引用的方式傳入
// 默認情況下,參數是以值的方式傳到函數中,所謂引用, 就是內外部實際訪問的是同一個變量
// 只需要在參數前添加一個取地址符: & 即可
$name = '歐陽克';
$f3 = function() use (&$name) {
return $name = '黃蓉';
};
echo $f3();
// 7、在子函數中的使用
function demo(){
$name = '歐陽克';
return function () use ($name) {
return $name;
};
}
//demo()返回結果是函數, 所以需要再次調用
echo demo()();
```
>[danger] 備:將一個函數的返回值,設置為一個閉包函數, 在實際開發中非常有用的, 等后面遇到具體應用場景時再細說
- 序言
- PHP基礎
- 認識PHP
- 環境安裝
- PHP語法
- 流程控制
- PHP數組
- PHP函數
- PHP類與對象
- PHP命名空間
- PHP7新特性
- PHP方法庫
- PHP交互
- 前后端交互
- 項目常規開發流程
- MySQL數據庫
- 會話控制
- Ajax分頁技術
- 細說函數
- 類與對象
- 對象進階
- 類與對象進階
- OOP面向對象
- 設計模式
- 路由與模板引擎
- 異常類
- PHP爬蟲
- PHP抓取函數
- PHP匹配函數
- 正則表達式
- PHP字符串函數
- 抓取實戰
- PHP接口
- 了解接口
- PHP插件
- PHPSpreadsheet
- ThinkPHP6
- 安裝
- 架構
- 數據庫
- 數據庫操作
- 視圖
- 模版
- 模型
- 雜項
- 命令行
- 交互
- 微信小程序
- 介紹
- 配置
- 組件
- 交互
- API
- 其他知識
- 百度小程序
- 介紹
- 配置
- 組件
- 交互
- API
- 其他知識
- Linux
- 服務器上線流程
- 安裝svn
- MySQL
- 認識MySQL
- MySQL函數
- 雜項
- composer依賴管理工具