函数
函数是实现代码复用的重要方式,在所有编程语言中均如此
function 函数名称(类型: 参数列表): 返回值类型
{
// 函数体
return 返回值;
}
// 函数调用: 按名称
函数名称(参数列表);
1. 函数的四种类型
序号 | 类型 | 语法 | 描述 |
---|---|---|---|
1 | 自定义函数 | function getName(){...} |
用户根据业务需求创建 |
2 | 系统函数 | substr(), count()... |
也叫预定义函数,不必声明直接调用 |
3 | 可变函数 | $funcName(); |
函数名使用变量表示 |
4 | 匿名函数 | $f = function (){...} |
也叫”闭包”或”函数表达式”,常用做回调处理 |
1.1 自定义函数
// 1. 自定义函数
// 根据需要自己创建的函数
// 根据折扣率获得实际需要支付的金额
function getJine (float $yuanjia , float $zhekou) : float
{
return $yuanjia * $zhekou;
}
echo '打折后的金额为:'. getJine(6000,0.95) . '<br>';
1.2. 系统函数
// 2. 系统函数
// 系统自带的函数,拿来即用
$title = '海军和海军陆战队携手 亚太美军跨军种联合行动';
// mb_substr(数据,起始位置,长度);
echo mb_substr($title,3,5);
echo '<hr>';
1.3. 可变函数
// 3. 可变函数
// 将函数名称保存在变量内,通过变量调用函数
$jiage = 'getJine';
echo '打折后的金额为:'. $jiage(9000,0.9) . '<br>';
echo '<hr>';
1.4. 匿名函数
// 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.1 字符串拼装
// 1. 字符串拼装
// 适合处理大量的php+html混写
// 这种返回的格式是用户自定义的,前端处理非常麻烦
function demo1() : string
{
$name = 'admin';
$dengji = '管理员';
return $name .',' . $dengji;
}
echo demo1();
echo '<hr>';
1.2 通过数组
// 2. 通过数组
function demo2() : array
{
return ['name' => 'admin','dengji' => '管理员'];
}
$res = print_r(demo2(),true);
printf('<pre>%s</pre>',$res);
echo '<hr>';
1.3 通过JSON返回
// 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>';
1.4 通过序列化返回多个值
// 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.1 值参数
// 1. 值参数
// 创建一个函数返回参数的两倍
function demo1(float $arg) : float
{
return $arg *= 2;
}
$value = 100;
echo demo1($value) , '<br>';
// 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo $value;
echo '<hr>';
1.2. 引用参数
// 2. 引用参数
function demo2(float &$arg) : float
{
return $arg *= 2;
}
$value = 100;
echo demo2($value) , '<br>';
// 如果在参数前面使用了取地址符 '&' , 则会改变原始调用参数的值
echo $value;
echo '<hr>';
1.3. 默认参数
// 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>';
1.4. 剩余参数
// 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.用在函数的调用参数列表中,表示”展开”,还原将一个数组展开成一个个离散的值