批改状态:合格
老师批语:回调函数后面会老师会详细讲的,尽量赶上老师的进度!
//函数是代码复用的重要手段, 函数是通过调用来执行的,函数命名要有意义,函数名以数字或下划线开头(不能以数字开头):function 函数名称的标识符(参数列表) {函数体,由一条或多条语句组成,也可以为空}//示例://声明函数demofunction demo($arg){echo "{$arg}";}//调用函数demo($arg='hello world'); //输出hello world
示例:
//1.自定义函数//在PHP7,一个新的功能,返回类型声明已被引入。返回类型声明指定一个函数返回值的类型function getnum($arg, $arg1): float{return $arg + $arg1;}echo '输出:' . getnum(11.1, 12) . '<hr>';// 2. 系统函数,php内置的函数,可以直接使用$pwd = '12345678';//内置的加密算法函数echo hash('md5', $pwd) . '<br>';echo sha1($pwd) . '<hr>';//3. 可变函数,是把函数名变为另一个变量的值function add($arg, $arg1): float{return $arg + $arg1;}$func = 'add';echo $func(2, 4) . '<hr>';//4. 匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值$demo = function ($str) {printf("Hello %s <br>", $str);};$demo('World');//闭包可以从父作用域中继承变量。任何此类变量都应该用 use 语言结构传递进去//当父作用域是全局时$num = 2;$p = function ($arg) use ($num): float {return $arg * $num;};echo '输出结果:' . $p(3.5) . '<br>';//父作用域是父函数$data = [['name' => 'jack', 'score' => 99],['name' => 'Anastasia', 'score' => 40],['name' => 'Abraham', 'score' => 80],['name' => 'Alexander', 'score' => 59],];$f = function ($data) {//在匿名函数后面加上"use(父作用域中的变量)"$p = function ($line) use ($data) : array {foreach ($data as $item) {$str[] = ['name'=> $item['name'],'result'=>($item['score'] > $line) ? '合格' : '不合格'];}return $str;};return $p;};$s = $f($data)(60);foreach ($s as $item){echo $item['name'].':'.$item['result'].'<br>';}

示例:
<?php// 函数是必须有返回值的,默认返回值为null 示例如下:function demo(){}var_dump(demo());echo '<hr>';// 函数只能返回单一的值,返回多值有以下几种方式// 1.通过字符串拼接function demo1():string{$str1 = 'hello';$str2 = 'php';return $str1 . $str2;}echo demo1().'<hr>';// 2.通过数组的方式function demo2():array{$name = '张三';$age = 22;return ['name' => $name,'age' =>$age ];}var_dump(demo2()['name']);echo '<br>',(demo2()['age']),'<hr>';// 3.通过json对象字面量字符串的方式function demo3():string{$str1 = 'hello';$str2 = 'world';return json_encode(['str1' => $str1,'str2' => $str2]);}//输出json格式数据echo demo3(),'<br>';// 将json数据解码print_r(json_decode(demo3()));echo '<hr>';// 4.序列化的方式function demo4():string{$name = '张三';$age = 22;return serialize(['name' => $name,'age' =>$age ]);}//序列化后的数据echo demo4(),'<br>';// 反序列化: 还原print_r(unserialize(demo4()));
//1.值参数$num = 999;function demo($num): float{return $num;}//2.引用传参$num1 = 666;//在参数前添加取地址符&function demo1(&$num1): float{// 函数内部对参数的更新会实时映射到外部实际参数return $num1 *= 2;}echo $num1, '<br>';//666echo demo1($num1), '<hr>';//1332// 3. 默认参数// 没有传参时默认的参数的值// 有默认值的参数,必须写到没有默认值参数的后面function demo2($num3, $num4, $n = 3){return $num3 * $num4 * $n;}// 没有传参数$n, 此时会使用$n的默认值3echo demo2(1, 10) . "<br>";//输出:30echo demo2(1, 10, 0.5) . "<hr>";//输出:5//4.剩余参数//参数不固定的情况下使用 ...参数名来表示,将所有参数整合到数组中.//剩余参数用在函数的参数列表中:收集//剩余参数用在函数的调用表达式中,是展开function demo3(...$args){//求传入参数的和return array_sum($args);}echo demo3(1, 2, 3) . "<br>";//输出6// 调用参数的数量不固定的情况$arr = [1, 2, 3];$res = demo3(...$arr);print_r($res);//5.回调函数//定义一个数组$data = range(1,100);//将数组中的每个值传到匿名函数中处理后返回处理以后的新数组$arr = array_map(function ($item) {if ($item % 2 === 0) return $item;}, $data);// 过滤掉空值$res=array_filter($arr);// 数组重排 array_values()var_dump(array_values($res));
namespace s1{function demo1(){return "这是space1";}}namespace s2{function demo1(){return "这是space2";}}namespace {echo s1\demo1();}
总结:初步掌握了函数的基本用法和参数传递,对回调函数的运行机制还是很模糊;
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号