函数声明
- 格式:function 函数名称的标识符(参数列表){一条或多条语句组成函数体,可为空}
- 代码复用的重要手段
函数声明示例:
<?php
// 函数声明:function 函数名称的标识符(参数列表){一条或多条语句组成函数体,可为空}
// 标识符:只允许字母、数字、下划线,不允许用数字开头
// 意义:代码复用的重要手段
// :后面表示结果是字符串
function getName($name, int $age):string
{
return $name . '今年' . $age . '岁了。';
}
echo getName('小刚', 18);
函数类型
- 自定义函数
- 系统函数
- 可变函数
- 匿名函数
示例:
<?php
// 1.自定义函数:
function getAge(int $born, int $now): int
{
return $now - $born;
}
echo getAge(1985, 2020);
echo '<br>';
// 2.系统函数:
// 返回当前时间戳
echo '当前时间戳:' . time();
// 转换时间戳
echo '当前时间为' . date('yy-m-d', time());
echo '<br>';
// 3.可变函数
$age = 'getAge';
echo '小刚的年纪:' . $age(1985, 2020) . '岁';
echo '<br>';
// 4.匿名函数,在php中也叫做闭包,可以访问父作用域中的变量
$age = function (int $born, int $now): int {
return $now - $born;
};
echo '小刚的年纪:' . $age(1985, 2020) . '岁';
echo '<hr>';
// 访问全局变量示例:
$name = '小刚';
$call = function (int $phone, int $height) use ($name): string {
return $name . '的电话是:' . $phone . '身高是:' . $height;
};
echo $call(13888888888, 190);
echo '<br>';
// 访问父函数示例:
$str = function ($name) {
$call = function (int $phone, int $height) use ($name): string {
return $name . '的电话是:' . $phone . '身高是:' . $height;
};
return $call;
};
echo $str('小明')(13666666666, 170);
函数的返回值
- 一定存在
- 只能返回单一值
- 返回多值的方法
示例;
<?php
// 函数的返回值一定存在
function func()
{
}
// 结果为null
var_dump(func());
echo '<br>';
// 1.字符串拼装
function str(): string
{
$name = '小刚';
$age = 18;
// return $name . $age . '岁了';
// 还可以加入html代码
return '<h3>' . $name . $age . '岁了' . '</h3>';
}
echo str() . '<hr>';
// 2.数组返回
function arr(): array
{
$name = '小刚';
$age = 18;
return ['名字' => $name, '年龄' => $age];
}
// 数组必须指定元素
echo arr()['名字'] . arr()['年龄'];
echo '<hr>';
// 3.json方式
function js(): string
{
$name = '小刚';
$age = 18;
// json_encode()将数组转换成json格式(javascript对象)
return json_encode(['名字' => $name, '年龄' => $age]);
}
// json_decode()将json格式的数据解析
print_r(json_decode(js(), true));
echo '<hr>';
// 4.序列化方式
echo serialize(['a', 'b', 'c']) . '<br>';
// 用于函数中
function ser(): string
{
$name = '小刚';
$age = 18;
return serialize(['名字' => $name, '年龄' => $age]);
}
echo ser() . '<br>';
// 反序列化
print_r(unserialize(ser()));
函数的参数
- 值参数(默认)
- 引用传参:将值与私有变量绑定
- 默认参数(不给参数报错)
- 剩余参数(将参数打包到数组中,可以不指定参数名也可以叫”收集”)
示例
<?php
// 1.值参数(默认)
function func1(int $a, int $b): int
{
$c = $a + $b;
return $c;
}
echo func1(1, 2) . '<br>';
// 2.引用传参:将值参数与私有变量绑定
function func2(int &$b): int
{
$b -= 2;
return $b;
}
$d = 5;
// $d与$b绑定
echo func2($d) . '<br>';
// 3.默认参数
function func3(int $id, string $opt = '没有用户')
{
$res = '默认用户';
switch ($opt) {
case '小刚':
$res = $id . '是' . '管理员' . '类型的用户';
break;
case '小明':
$res = $id . '是' . '运营' . '类型的用户';
break;
case '小红':
$res = $id . '是' . '制造' . '类型的用户';
break;
case '小小':
$res = $id . '是' . '开发' . '类型的用户';
break;
default:
$res = '非法用户';
}
return $res;
}
echo func3(1, '小刚'), '<br>';
echo func3(3), '<br>';
echo func3(5, '阿青'), '<br>';
// 不给参数会报错
// echo func3();
// 4.剩余参数,将参数打包到数组中,可以不指定参数名也可以叫"收集"
function func4(...$arr)
{
// return $arr;
// 返回数组中所有值的和
return array_sum($arr);
}
// 实参列表
// $res = func4('小明', '小刚', '小红');
// $res = func4(1, 2, 3);
// print_r($res);
// 形参列表
$ar = [2, 4, 6, 8, 10, 12, 14];
$res = func4(...$ar);
print_r($res);
回调函数
异步处理动态数据,不会阻塞。
示例
<?php
// 回调函数,异步处理动态数据,不会阻塞
// range()创建整数列表
$arr = range(2, 50, 2);
// print_r($arr);
$newArr = array_map(function ($item) {
if ($item % 3 === 0) return $item;
}, $arr);
// 得出数组中被3整除的值
print_r($newArr);
echo '<hr>';
// 过滤空值array_filter(数组, 回调)
$data = array_filter($newArr, function ($item) {
return $item;
});
print_r($data);
// 重排键名array_values(数组)
print_r(array_values($data));
函数命名空间
示例
<?php
// 函数命名空间
// 同一空间内不能重复命名,只要代码中使用了命名空间,其他成员必须都使用
namespace space1 {
function func1()
{
return 'space1';
}
echo func1() . '<br>';
}
// 报错
// function func1()
// {
// }
namespace space2 {
function func1()
{
return 'space2';
}
echo func1() . '<br>';
}
// 全局空间
namespace {
function func1()
{
return 'namespace';
}
echo func1() . '<br>';
}
总结
- 标识符:只允许字母、数字、下划线,不允许用数字开头
- 代码复用的重要手段
- 系统预设函数关键字不能重复
- json数据用于前后端和接口之间数据交互
- 活用预设函数解决变量取值等操作