# :-: 一、函数是什么
* 函数是一段需要重复执行的代码片断
* 函数是实现代码复用的重要手段
* 函数是现代编程语言最重要的基本单元
* 函数永远是编程的核心工作
*****
# :-: 二、函数的分类
根据函数的提供者(编写者),分为二类
* 系统函数: 编程语言开发者事先写好提供给开发者直接使用的
* 自定义函数: 用户根据自身需求,对系统功能进行扩展,我们又称为方法
*****
# :-: 三、函数的基本语法
* 语法: `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依赖管理工具