函数语法
1.函数的构成
- 函数分成三个部分
- 1.fun1 是函数名
- 2.$a,$b 参数
- 3.return $a+$b; 函数的返回值
function fun1($a,$b){
//显式
return $a+$b;
//隐式:结束大括号时候自动返回
}
echo fun1 (10,20);
2.函数的声明
1.自定义函数
- 自定义函数就是 自己命名按照需求去写的函数
- getPrice 小驼峰命名法
- get_price蛇形命名法 声明公共函数时候用
function getPrice($a,$b){
$sum=$a+$b;
}
getPrice (1,2);
2.系统函数
$str='今天上课真开心';
echo mb_substr ($str,0,5);
3.可变函数/变量函数
- 把函数变成变量存进去
- 写了个小实例就是上传文件是png时候用png的处理方式
$fileName='hhh.png';
$action= trim (strrchr ($fileName,'.'),'.');
function jpg(){
echo 'jpg';
}
function png(){
echo 'png';
}
echo $action($fileName);
4.匿名函数:闭包
- 匿名函数没有名字调用,传参普通函数一样 没人么区别
$discount=0.8;
$getAmount =function (float $money, int $num) use($discount):float
{
$amount =$money*$num;
return $amount>=2000?$amount*$discount:$amount;
};
//echo $getAmount(100,20);
- 1.链接闭包和外界变量的关键字是use 闭包函数不能调用所在代码块的上下文变量,而需要通过使用use关键字
- 2.在子级函数中使用use 就能引用到全局变量 并且把子级函数像变量一样 返回出去
- 3.传参是时候//echo $f(0.6)(200,20);
$discount=0.8;
$f=function ($discount){
$getAmount =function (float $money, int $num) use($discount):float
{
$amount =$money*$num;
return $amount>=2000?$amount*$discount:$amount;
};
return $getAmount;
};
//echo $f(0.6)(200,20);
3.函数的返回值
- 函数的返回值原则上是单值返回 如果需要多值返回那么有4种
- 1.字符串拼接
- 2.数组
- 3.json
- 4.序列化返回
1.字符串拼接
- 适合处理大量的php+html混写
- 这种返回的格式是用户自定义的,前端处理非常麻烦
function demo1(){
$status=1;
$message='成功';
return $status . $message;
}
echo demo1 ();
2.数组返回
function demo2(){
return ['status'=>'1' , 'message'=>'成功'];
}
//echo print_r (demo2(),true);
3.把数组用 json 返回
- json :是通过js对象字面量的方式来表示数据,是一种轻量级的通用的数据交换或者传输方式
- json:本质上就是一个具有一定结构和格式的字符串,不过这种格式得到了公认,几乎所有的编程员都有支持他的接口
- 有两个函数 json_decode//将json格式的字符串还原/解析成php的数组或者对象 第二个参数要传true json_encode//将php数据编码为json返回
function demo3(){
//json_encode ();将php数据编码为json返回
return json_encode (['status'=>'1' , 'message'=>'成功']);
}
$data= demo3 ();
//将json格式的字符串还原/解析成php的数组或者对象 第二个参数要传true
$var =json_decode ($data,true);
//print_r ($var);
//这是返回值
{
"status":"1",
"message":"\u6210\u529f"
}
4.序列化
- 序列化是php独有的形成字符串的返回的方式
- serialize()//序列化这段合法的字符串
- unserialize()//序列化后的变回字符串形式
function demo4(){
return serialize (['status'=>'1' , 'message'=>'成功']);
}
echo demo4 ();
//a:2:{s:6:"status";s:1:"1";s:7:"message";s:6:"成功";} 这是值
print_r (unserialize (demo4 ()));
//这是返回值
//Array ( [status] => 1 [message] => 成功 )
4.函数参数
1.值参数
function demo1($arg){
return $arg *=2;
}
$val=100;
echo demo1 ($val),'<br>';
//在函数中改变了调用参数的值 ,但是原始调用参数并没有发生变化
echo $val .'<hr>';
2.引用参数
- 也就是用取地址符来改变参数的值,也就是以传址的方式改变变量的值
function demo1(&$arg){
return $arg *=2;
}
$val=100;
echo demo1 ($val),'<br>';
//在函数中改变了调用参数的值 ,但是原始调用参数并没有发生变化
echo $val .'<hr>';
3.默认参数
function demo3(float $a,float $b,string $opt='+')
{
if ($opt=='+'){
$res=$a+$b;
} elseif ($opt=='-'){
$res=$a-$b;
}elseif ($opt=='*'){
$res=$a*$b;
}elseif ($opt=='/'){
$res=$a/$b;
}else{
$res='去你的吧';
}
return $res;
}
//echo demo3 (10,20).'<br>';
echo demo3 (10,20,'1').'<br>';
//echo '<hr>';
4.剩余参数
- 剩余参数是简化了多个的传进来的值
- 参数也可以是数组的形式
//剩余参数归纳符
function demo6(...$args)
{
return $args;
}
//print_r (demo6(1,2,3,4,5,6,8)) ;
//echo 123;
function demo6(...$args)
{
return array_sum ($args);
}
//print_r (demo6(1,2,3,4,5,6,8)) ;
//echo 123;
$args=[1,23,5,123,51];
扩展数组解包
//1.用在函数的形式参数列表中,表示收集,将多个离散的参数打包到一个数组中
//2.用在函数的调用列表中,表示展开,还原将一个数组展开成一个个参数值
$arr[]=[101,'php1','html1'];
$arr[]=[102,'php2','html2'];
$arr[]=[103,'php3','html3'];
//数组解包
foreach ($arr as list($id ,$name ,$grade)){
printf ('id=%s,name=%s<br>',$id,$name);
}