批改状态:合格
老师批语:请以当下的课堂作业为主
函数是实现代码复用的重要方式,在所有编程语言中均如此
function 函数名称(类型: 参数列表): 返回值类型{// 函数体return 返回值;}// 函数调用: 按名称函数名称(参数列表);
| 序号 | 类型 | 语法 | 描述 |
|---|---|---|---|
| 1 | 自定义函数 | function getName(){...} |
用户根据业务需求创建 |
| 2 | 系统函数 | substr(), count()... |
也叫预定义函数,不必声明直接调用 |
| 3 | 可变函数 | $funcName(); |
函数名使用变量表示 |
| 4 | 匿名函数 | $f = function (){...} |
也叫”闭包”或”函数表达式”,常用做回调处理 |
// 1. 自定义函数// 根据需要自己创建的函数// 根据折扣率获得实际需要支付的金额function getJine (float $yuanjia , float $zhekou) : float{return $yuanjia * $zhekou;}echo '打折后的金额为:'. getJine(6000,0.95) . '<br>';

// 2. 系统函数// 系统自带的函数,拿来即用$title = '海军和海军陆战队携手 亚太美军跨军种联合行动';// mb_substr(数据,起始位置,长度);echo mb_substr($title,3,5);echo '<hr>';

// 3. 可变函数// 将函数名称保存在变量内,通过变量调用函数$jiage = 'getJine';echo '打折后的金额为:'. $jiage(9000,0.9) . '<br>';echo '<hr>';

// 4. 匿名函数:也叫闭包// 将函数当成值赋给一个变量$getjine = function (float $yuanjia, int $shuliang ){$jine = $yuanjia * $shuliang;return $jine;};echo '金额为:'. $jiage(3000,6) . '<br>';// 可以访问父作用域中的变量$zhekou = 0.9;$getjine = function (float $yuanjia, int $shuliang ) use ($zhekou) :float{$jine = $yuanjia * $shuliang;return $jine > 3000 ? $jine * $zhekou : $jine;};echo '金额为:'. $getjine(4000,6) . '<br>';

| 序号 | 场景 | 描述 |
|---|---|---|
| 1 | return |
可以返回任何类型的值,包括函数类型 |
| 2 | 无return |
遇到}也会返回, 默认返回null |
| 序号 | 返回值类型 | 描述 |
|---|---|---|
| 1 | string |
字符串拼接 |
| 2 | array |
数组 |
| 3 | json |
JSON 字符串 |
| 4 | serialize |
序列化字符串 |
json 和序列化,使用时需要进行解码操作
// 1. 字符串拼装// 适合处理大量的php+html混写// 这种返回的格式是用户自定义的,前端处理非常麻烦function demo1() : string{$name = 'admin';$dengji = '管理员';return $name .',' . $dengji;}echo demo1();echo '<hr>';

// 2. 通过数组function demo2() : array{return ['name' => 'admin','dengji' => '管理员'];}$res = print_r(demo2(),true);printf('<pre>%s</pre>',$res);echo '<hr>';

// 3. 通过JSON返回// json: 是用js对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式// json本质上就是一个具有一定结构和格式的字符串, 不过这种格式得到了公认,几乎所有编程语言都有支持它的接口function demo3() : string{// json_encode(): 将php数据编码为json格式的字符串返回return json_encode(['name' => 'admin','dengji' => '管理员']);}$data = demo3();echo $data;echo '<hr>';// 将json格式的字符串还原/解析为php对象$var = json_decode($data);print_r($var);echo '<hr>';// 将json格式的字符串还原/解析为数组$var = json_decode($data, true);print_r($var);echo '<hr>';

// 4. 通过序列化返回多个值// 其实json也是一种序列化function demo4() : string{return serialize(['name' => 'admin','dengji' => '管理员']);}echo demo4();// 反序列化才可以使用$arr =unserialize(demo4());printf('<pre>%s</pre>', print_r($arr,true));

参数类型
| 序号 | 类型 | 描述 |
|---|---|---|
| 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);}

匿名函数:闭包,可以通过use访问父作用域的变量
函数返回值:原则是单值返回分为:字符串拼装\数组\JSON字符串:json_encode();\序列化: 字符串serialize();
函数参数:
值参数:在函数中改变了调用参数的值,但原始调用参数并没有发生变化
引用参数:如果在参数前面使用了取地址符,则会改变原始调用参数的值
默认参数:默认参数必须写在必选参数的后面
剩余参数:(使用 ... 运算符定义剩余参数函数)
1.用在函数的形式参数列表中,表示”收集”,将多个离散的参数打包到一个数组中处理
2.用在函数的调用参数列表中,表示”展开”,还原将一个数组展开成一个个离散的值
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号