//demo01
function caculator(int $a,int $b):int{
$c=$a+$b;
return $c;//隐式返回,用echo;
}
$d=caculator(10.5, 20.3);//返回值仍然是整数,因为参数限定是int
echo $d.'<br>';
//字符串截取:系统函数
$a='i like every day';
$b=substr($a,0,5);
echo $b.'<br>';
//可变函数
$funcname='caculator';
echo $funcname(8000,0.8).'<br>';
//匿名函数:闭包;use():闭包专用,可以使用父级变量;
$discount=0.8;
$getamount=function (float $money,int $num) use ($discount){
$amount=$money*$num;
return $amount>=2000?$amount*$discount:$amount;
};
echo $getamount(200,10).'<br>';
$f=function (float $discount){
$getamount=function (float $money,int $num) use ($discount){
$amount=$money*$num;
return $amount>=2000?$amount*$discount:$amount;
};
return $getamount;
};
echo $f(0.8)(200,10).'<br>';
//demo03
//返回值
function result1(){
$state=1;
$status='success';
return $state.':'.$status;
}
echo result1().'<br>';
function result2(){
$state=1;
$status=1;
$obj['state']=$state;
$obj['status']=$status;
return $obj;
}
var_dump(result2());
echo '<br>';
function result3(){
$obj['state']=1;
$obj['status']='success';
return json_encode($obj);
}
echo result3().'<br>';
$obj=result3();
$res=json_decode($obj,true);
var_dump($res);
echo '<br>';
function result4(){//序列化
$obj['state']=1;
$obj['status']='success';
return serialize($obj);
}
echo result4().'<br>';
//反序列化
$res=result4();
$obj1=unserialize($res);
var_dump($obj1);
echo '<br>';
//demo04
//值参数
//引用参数:
//默认参数
//剩余参数
function doadd1(float $arg){
return $arg+=1;
}
$value=100;
echo doadd1($value),'<br>';
echo $value,'<br>';
function doadd2(float &$arg){//引用传递!!!
return $arg+=1;
}
$value=100;
echo doadd2($value),'<br>';
echo $value,'<br>';//注意,这里的$value值被改变了!!!
//注意:默认参数必须在最后,否则会出错;default的用法注意一下;
function doadd3(float $a,float $b,string $opt='+'){//默认参数(其实就是参数有一个默认值
$result=0;
switch ($opt){
case '+':$result="$a+$b=".($a+$b);break;
case '-':$result="$a-$b=".($a-$b);break;
case '*':$result="$a*$b=".($a*$b);break;
case '/':$result="$a/$b=".($a/$b);break;
default:$result='非法操作符';
}
return $result;
}
echo doadd3(10,20).'<br>';
//学会两个系统函数:
//func_num_args();//参数个数
//func_get_arg();//某个参数(需要索引号)
//func_get_args();//所有参数(数组)
//做+=时,或$res=$res+1;时,需要先定义$res;
function doadd4(){
$res=0;
$number=func_num_args();
for ($i=0;$i<$number;$i++){
$res+=func_get_arg($i);
}
return $res;
}
echo doadd4(3,4,7,8,20);
function doadd5(){//变为数组了
$res=func_get_args();
return $res;
}
$res=doadd5(2,3,4,5,6);
var_dump($res);
echo '<br>';
//demo05剩余参数
//...$args起到了:$args=func_get_args();的作用;将参数之间变为数组;称为剩余参数;
function doadd6(...$args){
return array_sum($args);
}
print_r(doadd6(3,4,7,8,20).'<br>');
//也可以采用这样的方式:
$arr=[3,4,7,8,20];
$res=doadd6(...$arr);
var_dump($res);
echo '<br>';
$res=doadd6($arr);//注意:直接给$arr是不行的;运行结果是0;
var_dump($res);
echo '<br>';
//结论:...$args不仅可以在创建函数时使用,也可以在调用函数时使用;
//遍历数组时,list的作用
$res=array();
$res[]=[1,'frank'];
$res[]=[2,'peter'];
$res[]=[3,'jack'];
foreach ($res as list($id,$name)){
printf('id=%s,name=%s<br>',$id,$name);
}