Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:函数的返回值很有意思, 值得研究
定义:函数是实现代码复用的重要方法,在所有编程语言中均如此
代码实例:
//函数定义
function 函数名称(类型:参数列表):返回值类型
{
//函数体
return 返回值;
};
序号 | 名称 | 描述 |
---|---|---|
1 | function |
声明函数 |
2 | 函数名称 |
复合 PHP 标识符命名规范,不区分大小写 |
3 | 参数列表 |
另个或多个接收外部传入到函数的变量 |
4 | {... |
创建出一个封闭的函数作用域 |
5 | 函数体 |
由零个或多个合法的 PHP 语句组成 |
6 | return 值 |
将执行结果返回函数调用者[可选] |
7 | ...} |
函数执行结束,如果没有 return ,则返回 null |
序号 | 类型 | 语法 | 描述 |
---|---|---|---|
1 | 自定义函数 | function getMess(){...} |
用户根据业务需求创建 |
2 | 系统函数 | gettype(),date() |
也叫预定义函数,不必声明直接调用 |
3 | 可变函数 | $funcName() |
函数名使用变量表示 |
4 | 匿名函数 | $f = function(){...} |
也叫“闭包”或“函数表达,常用做回调函数处理” |
// 1. 自定义函数
// 自定义一个函数addNmu() ,计算两数之和并返回
function myName(string $name) : string
{
return "我的名字叫做".$name;
};
// 调用并输出
echo myName('wen');
echo '<hr>';
// 2. 系统函数
//date() 获取当前系统时间
echo date('Y-m-d H:s:i');
echo '<hr>';
// 3. 可变函数
//定义一个变量等于函数名
$funcName = 'myName';
echo $funcName('yu');
echo '<hr>';
// 4. 匿名函数:又叫闭包,可以访问父作用域的变量
//形式1:父作用域是全局
$age = 18;
// 闭包访问父作用域变量格式:在参数后 加 use ($age),自定义函数访问父作用域变量使用 global $age;
$myInter = function(string $name) use ($age) : string
{
return "我的名字叫做".$name.",我今年".$age;
};
echo $myInter('goodboy');
echo '<br>';
//形式2:父作用域又是函数
$mess = function($age){
//子函数
$myInter = function(string $name) use ($age) :string
{
return "我的名字叫做".$name.",我今年".$age;
};
return $myInter;
};
//因为$mess() 返回的是一个闭包对象
//调用方法:
echo $mess(18)('goodgood');
序号 | 场景 | 描述 |
---|---|---|
1 | return |
可以返回任何类型的值,包括函数类型 |
2 | 无return |
遇到} 也会返回,默认返回null |
//return
function addOne(int $a,int $b) : string
{
//显示返回
return "$a + $b =".($a+$b);
};
//无 return
function addTwo(int $a,int $b)
{
//隐式返回无 return
echo "$a + $b =".($a+$b);
};
序号 | 返回值类型 | 描述 |
---|---|---|
1 | string |
字符串拼接 |
2 | array |
数组 |
3 | json |
JSON 字符串 |
4 | serialize |
序列化字符串 |
//函数返回多个值
function getData()
{
$name = 'wen';
$age = 18;
$sex = 'man';
// 1. 字符串拼接: 使用字符串拼接符 '.'
// return "姓名:".$name.",年龄:".$age.",性别:".$sex;
// 2. 数组 : array
// return ['姓名'=>$name,'年龄'=>$age,'性别'=>$sex];
// 3. JSON 字符串
// json_encode():将PHP数据编码为json格式的字符串返回
// json_decode():对json格式的字符串进行解码
// return json_encode(['姓名'=>$name,'年龄'=>$age,'性别'=>$sex]);
// 4. serialize 序列化
return serialize(['姓名'=>$name,'年龄'=>$age,'性别'=>$sex]);
};
// 返回的字符串使用 echo
// echo getData();
//返回的是数组 使用 print_r
// print_r(getData());
//使用json格式返回的数据,需要使用 json_decode() 函数进行解码,默认解析成的是对象,加参数 true 之后解析为数组
// print_r(json_decode(getData(),true));
// 使用serialize 序列化传输的数据,需要解序列化
print_r(unserialize(getData()));
json:是用 js 对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式
json 本质上就是一个具有一定结构和格式的字符串,不过这种格式得到了公认,几乎所有编程语言都有支持它的接口
json 也是一种序列化
参数类型
序号 | 类型 | 描述 |
---|---|---|
1 | 值参数 | 默认传参方式 |
2 | 引用参数 | 改变原始调用参数值 |
3 | 默认参数 | 调用时运行省略的参数 |
4 | 剩余参数 | 调用参数数量不确定 |
<?php
//函数参数
// 1. 值参数 : 默认
function demo1(float $arg) : float
{
$arg = $arg * 2;
return $arg;
};
$value = 100;
echo demo1($value),'<br>';
echo $value;
// 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo '<hr>';
// 2. 引用参数
function demo2(float &$arg) : float
{
$arg *=2;
return $arg;
}
$value = 200;
echo demo2($value),'<br>';
echo $value;
// 如果在参数前面使用了取地址符 '&',则会改变原始调用参数的值
echo '<hr>';
// 3. 默认参数:默认参数必须写在必选参数后面
function demo3(string $name,int $age,string $sex='保密') : string
{
return "我的名字叫做".$name.",我今年".$age.",我的性别".$sex;
};
echo demo3('o(∩_∩)o 哈哈',18);
echo '<hr>';
// 4. 剩余参数
//...: 参数归纳
//...:用在函数的形参列表中,表示“收集”,将多个离散的参数打包到一个数组中处理
function demo4(...$args) : float
{
$total = 0;
// 计算所有参数之和
//方法1:
// for($i = 0;$i < count($args);$i++){
// $total +=$args[$i];
// };
// 方法2:
$total = array_sum($args);
return $total;
}
// echo demo4(1,2,3,4,5);
$arr = [1,5,7,9,3,6];
// ...:用在函数的调用参数列表中,表示“展开”,还原将一个数组展开成一个个离散的值
echo demo4(...$arr);
语法 | 类型 | 执行方式 | 应用场景 |
---|---|---|---|
匿名函数 | 闭包Closure |
异步 | 函数参数 |
-代码实例:
//回调函数
$date = ['html5','css3','javscript','jquery','php'];
//方式1:普通函数写法
function repeat($arr){
//把所有字符都大写
return strtoupper($arr);
}
//将用户自定义函数作用到给定数组的每个值上,返回新的值。
print_r(array_map('repeat',$date));
echo '<hr>';
//方式2:定义一个匿名函数
// ucfirst() 字符串首字母大写
$mess = print_r(array_map(function($arg){return ucfirst($arg);},$date));