一、函数的四种类型
1、函数语法:
/*
function '函数名' {
'函数体'
}
*/
2、函数类型:
序号 | 类型 | 语法 | 描述 |
---|---|---|---|
1 | 自定义函数 | function getName(){...} |
用户根据业务需求自己创建 |
2 | 系统函数 | substr(), count()... |
也叫预定义函数,不必声明直接调用 |
3 | 可变函数 | $funcName(); |
函数名使用变量表示 |
4 | 匿名函数 | $f = function (){...} |
也叫”闭包”或”函数表达式”,常用做回调处理 |
3、代码演示
<?php
// 1. 自定义函数
/*function inpre(array $arr) : array
{
echo '<pre>';
print_r($arr);
echo '</pre>';
}
$arr = ['html', 'php', 'css', 'js'];
inpre($arr);
echo '<hr>';*/
// 2. 系统函数
// `strtoupper();`: 将字符串转化为大写
$str = 'danh sach cong nhan moi';
echo strtoupper($str) .'<br>';
// `ucfirst();`: 将字符串的首字母转换为大写
$str = 'danh sach cong nhan moi';
echo ucfirst($str);
echo '<hr>';
// 3. 可变函数
$getTien = function(float $gia, float $so):float
{
return $gia * $so;
};
echo $getTien(10000, 6);
echo '<hr>';
// 4. 匿名函数: 访问父作用域变量
function demo2(float $discont)
{
return function(float $gia, float $so) use($discont) :float
{
return $gia * $so * $discont;
};
}
echo demo2(0.8)(5000, 4);
效果截图:
二、函数的返回值的四种形式
- 函数必须要有返回值
- 函数必须是遵守单值返回原则
return
可以返回任何类型的值,包括函数类型- 无
return
遇到}
也会返回, 默认返回null
1、多值返回方法
序号 | 返回值类型 | 描述 |
---|---|---|
1 | string |
字符串拼接 |
2 | array |
数组 |
3 | json |
JSON 字符串 |
4 | serialize |
序列化字符串 |
json 和序列化,使用时需要进行解码操作
2、代码演示
<?php
// 函数返回多值的方法
// 1. 字符串拼装
function demo3() : string
{
$quocgia = 'VietNam';
$thudo = 'HaNoi';
return '国家: ' .$quocgia .', 首都: ' . $thudo;
}
echo demo3();
echo '<hr>';
// 2. 数组
function demo31($gia, $so) : string
{
$arr = [$gia + $so, $gia - $so, $gia * $so, $gia / $so];
return print_r($arr);
}
demo31(200, 100);
echo '<hr>';
// 3. JSON字符串
// json: 是用js对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式
// json本质上就是一个具有一定结构和格式的字符串, 不过这种格式得到了公认,几乎所有编程语言都有支持它的接口
function demo32() : string
{
// json_encode(): 将php数据编码为json格式的字符串返回
return json_encode(['name'=>'dashu', 'mail'=>'dashu@qq.com']);
}
$data = demo32();
echo $data .'<br>';
// 将json格式的字符串还原/解析为php对象/数组
$var = json_decode($data, true);
print_r($var);
echo '<hr>';
// 4. 序列化: 字符串
function demo33() : string
{
return serialize(['name'=>'dashu', 'mail'=>'dashu@qq.com']);
}
echo demo33() .'<br>';
// 反序列化才可以使用
$arr =unserialize(demo33());
print_r($arr);
效果截图:
三、函数的四种参数
序号 | 类型 | 描述 |
---|---|---|
1 | 值参数 | 默认传参方式 |
2 | 引用参数 | 改变原始调用参数值 |
3 | 默认参数 | 调用时允许省略的参数 |
4 | 剩余参数 | 调用参数数量不确定 |
代码演示
<?php
// 函数参数
// 1. 值参数
function demo4(float $so) : float
{
return $so *= 8;
}
$value = 100;
echo demo4($value) , '<br>';
// 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo $value;
echo '<hr>';
// 2. 引用参数
function demo41(float &$so) : float
{
return $so *= 8;
}
$value = 100;
echo demo41($value) , '<br>';
// 如果在参数前面使用了取地址符,则会改变原始调用参数的值
echo $value;
echo '<hr>';
// 3. 默认参数:参数有默认值
// 默认参数必须写在必选参数的后面
function demo42(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 demo42(10, 20), '<br>';
echo demo42(10, 20, '*'), '<br>';
echo demo42(10, 20, '#'), '<br>';
echo '<hr>';
// 4. 剩余参数
// ...: 参数归纳:
function demo43(...$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 = [4,6,7,45,63,99,22,67];
// ...:
// 1. 用在函数的形式参数列表中,表示"收集",将多个离散的参数打包到一个数组中处理
// 2. 用在函数的调用参数列表中,表示"展开",还原将一个数组展开成一个个离散的值
print_r(demo43(...$arr));
echo '<hr>';
效果截图: