Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:以上是我个人总结, 不同的教材总结不一样, 不过, 我对我自己的总结还是自信的, 望采纳
[toc]
函数是实现代码复用的重要方式,在所有编程语言中均如此
function 函数名称(类型: 参数列表): 返回值类型
{
// 函数体
return 返回值;
}
序号 | 名称 | 描述 |
---|---|---|
1 | function |
声明函数 |
2 | 函数名称 |
符合 PHP 标识符命名规范,不区分大小写 |
2 | 参数列表 |
零个或多个接收外部传入到函数的变量 |
2 | {... |
创建出一个封闭的函数作用域 |
2 | 函数体 |
由零个可多个合法的 PHP 语句组成 |
2 | return 值 |
将执行结果返回函数调用者[可选] |
2 | ...} |
函数执行结束,如果没有return ,则返回null |
<?php
// 函数语法
// 二数求和
//函数的声明
function sum(float $a, float $b ):string
{
$total=$a+$b;
// 显式
return '求两个数之和:'."$a+$b=".$total;
// 隐式: 结束大括号的时候会自动返回
}
// 函数调用: 按名称
echo sum(30,60);
echo '<hr>';
echo sum(20.5,30.6);
序号 | 类型 | 语法 | 描述 |
---|---|---|---|
1 | 自定义函数 | function getName(){...} |
用户根据业务需求创建 |
2 | 系统函数 | substr(), count()... |
也叫预定义函数,不必声明直接调用 |
3 | 可变函数 | $funcName(); |
函数名使用变量表示 |
4 | 匿名函数 | $f = function (){...} |
也叫”闭包”或”函数表达式”,常用做回调处理 |
<?php
// 函数
// 1. 自定义函数
// 2. 系统函数
// 3. 可变函数
// 4. 匿名函数:
// getPrice: 小驼峰命名法
// get_price: 蛇形命名法
// 命名函数
function getPayment( float $number , float $money)
{
return $number*$money ;
}
echo '总价为: ' . getPayment(5, 35);
echo '<hr>';
// 2. 系统函数
// function mb_substr(){
// //....
// }
$str = '各省市复工复学注意事项';
// 仅获取前7个字符
echo mb_substr($str, 0, 7);
echo '<hr>';
// 3. 可变函数
$totalFun = 'getPayment';
echo '总价为: ' . $totalFun(20,35);
echo '<hr>';
// 4. 匿名函数: 闭包, 可以访问父作用域的变量
$discount = 0.6;
// $discount 的作用域是全局
$getAmount = function (float $money, int $num) use ($discount) : float
{
$amount = $money * $num;
return $amount >= 2000 ? $amount * $discount : $amount;
};
echo '实付金额: ' . $getAmount(100, 20);
echo '<hr>';
// 如果父作用域又是一个函数
$f = function ($discount) {
// 子函数
return function (float $money, int $num) use ($discount) : float
{
$amount = $money * $num;
return $amount >= 2000 ? $amount * $discount : $amount;
};
};
//$a = var_dump($f(0.6));
//echo gettype( $f);
//$tmp = $f(0.6);
//echo '实付金额: ' .$tmp(200, 20);
echo '实付金额: ' .$f(0.6)(200, 20);
// 200 * 20 = 4000 * 0.6 = 2400
序号 | 场景 | 描述 |
---|---|---|
1 | return |
可以返回任何类型的值,包括函数类型 |
2 | 无return |
遇到} 也会返回, 默认返回null |
序号 | 返回值类型 | 描述 |
---|---|---|
1 | string |
字符串拼接 |
2 | array |
数组 |
3 | json |
JSON 字符串 |
4 | serialize |
序列化字符串 |
json 和序列化,使用时需要进行解码操作
<?php
// 返回值
// 原则: 单值返回
// 如果需要返回多值
// 1. 字符串拼装
// 2. 数组
// 3. JSON字符串
// 4. 序列化: 字符串
// 1. 字符串拼装
function test():string
{
$password=123;
$result='验证通过,允许登录';
return $password .';' . $result;
}
echo test();
echo '<hr>';
// 适合处理大量的php+html混写
// 这种返回的格式是用户自定义的,前端处理非常麻烦
// 2. 通过数组
function test2() : array
{
return ['password'=>123, 'result'=>'验证通过,允许登录'];
}
// echo '<pre>'.print_r(demo2(), true).'</pre>';
$res = print_r(test2(), true);
printf('<pre>%s</pre>', $res);
echo test2()['password'] == 1 ? '<span style="color:green">'.test2()['result']. '</span>' : '验证失败';
echo '<hr>';
// 3. 通过JSON返回
// json: 是用js对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式
// json本质上就是一个具有一定结构和格式的字符串, 不过这种格式得到了公认,几乎所有编程语言都有支持它的接口
function test3() : string
{
// json_encode(): 将php数据编码为json格式的字符串返回
return json_encode(['password'=>123, 'result'=>'验证通过,允许登录']);
}
$data = test3();
echo $data;
// 将json格式的字符串还原/解析为php对象/数组
$var = json_decode($data, true);
print_r($var);
echo '<hr>';
// 4. 通过序列化返回多个值
// 其实json也是一种序列化
function test4() : string
{
return serialize(['password'=>123, 'result'=>'验证通过,允许登录']);
}
echo test4();
// 反序列化才可以使用
$arr =unserialize(test4());
printf('<pre>%s</pre>', print_r($arr,true));
参数类型
序号 | 类型 | 描述 |
---|---|---|
1 | 值参数 | 默认传参方式 |
2 | 引用参数 | 改变原始调用参数值 |
3 | 默认参数 | 调用时允许省略的参数 |
4 | 剩余参数 | 调用参数数量不确定 |
<?php
// 函数参数
// 1. 值参数
// 2. 引用参数
// 3. 默认参数
// 4. 剩余参数
// 1. 值参数, 默认
function demo1(float $arg) : float
{
return $arg *= 2;
}
$value = 100;
echo demo1($value) , '<br>';
// 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo $value;
echo '<hr>';
// 2. 引用传递
function demo2(float &$arg) : float
{
return $arg *= 2;
}
$value = 100;
echo demo2($value) , '<br>';
// 如果在参数前面使用了取地址符,则会改变原始调用参数的值
echo $value;
echo '<hr>';
// 3. 默认参数
// 默认参数必须写在必选参数的后面
function demo3(float $a, float $b, string $opt = '+' )
{
$res = 0;
switch ($opt) {
case '+':
$res = "$a + $b = " . ($a + $b);
break;
case '-':
$res = "$a - $b = " . ($a - $b);
break;
case '*':
$res = "$a * $b = " . ($a * $b);
break;
case '/':
$res = "$a / $b = " . ($a / $b);
break;
default:
$res = '非法操作符';
}
return $res;
}
echo demo3(10, 20), '<br>';
// echo demo3(10, 20, '*'), '<br>';
// echo demo3(10, 20, '#'), '<br>';
echo '<hr>';
// 4. 剩余参数
function demo4(float $a, float $b, float $c ) : float
{
return $a + $b + $c;
}
// 计算三个数之和
echo demo4(1,2,3), '<br>';
echo '<hr>';
function demo5( )
{
// 参数数量
// return func_num_args();
// 根据索引返回指定的调用参数
// return func_get_arg(2);
// return func_get_args();
$total = 0;
// for ($i = 0;$i <func_num_args(); $i++ ) {
// $total +=func_get_arg($i);
// }
// return $total;
foreach (func_get_args() as $value) {
$total +=$value;
}
return $total;
}
// echo demo5(3,4,7,8,24);
print_r(demo5(3,4,7,8,24));
echo '<hr>';
// echo demo5(1,2,3,4,5,6,9,22,67), '<br>';
// 使用剩余参数简化
// ...: 参数归纳:
function demo6(...$args ) : float
{
// return $args;
return array_sum($args);
// return array_product($args);
}
// print_r(demo6(3,4,7,8,24));
// echo demo6(1,2,3,4,5,6,9,22,67), '<br>';
// 调用参数
$arr = [1,2,3,4,5,6,9,22,67];
// ...:
// 1. 用在函数的形式参数列表中,表示"收集",将多个离散的参数打包到一个数组中处理
// 2. 用在函数的调用参数列表中,表示"展开",还原将一个数组展开成一个个离散的值
print_r(demo6(...$arr));
echo '<hr>';
// $config = ['localhost', 'phpedu', 'uft8', '3306'];
// $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
// $db = [$dsn, $username, $password];
// $pdo = new PDO(...$db);
// 扩展知识
$user[] = [100, 'admin', 90];
$user[] = [110, 'peter', 60];
$user[] = [120, 'jack', 98];
// 数组解包
// js中解构赋值, php中也有解构
foreach ($user as list($id, $name)) {
printf('id=%s, name=%s<br>', $id, $name);
}
语法 | 类型 | 执行方式 | 应用场景 |
---|---|---|---|
匿名函数 | 闭包Closure |
异步 | 函数参数 |
异步执行,是指当前函数的执行并不会中断当前程序的执行流程
本次课程详细介绍了函数类型、返回值、参数等相关知识,老师用归纳和实例的方式讲解了对应内容,主要有以下几个方面:
函数的类型:
函数的返回值:
原则: 单值返回,如果需要返回多值,可按以下方式进行
函数参数: