变量是 数据利用的重要手段函数的格式
function 函数名(参数){
函数体
}
其中,函数名和变量一样,必须由数字 字母 下划线组成,可为空。参数也可为空。函数体由多条语句构成,也可为空。演示效果
function score(string $a,int $b):string{//php函数名后冒号+数据类型(返回值类型限制/php新特性)
return $a.'的分数是'.$b;
}
echo score('小明',90).'<hr>';

函数类型
1.自定义函数 ,命名函数,具名函数
function getPrice(float $money,float $discount):float{
return $money*$discount;
}
echo '最终金额是:'.getPrice(981,0.5).'<hr>';

2.系统函数(预定义函数)
$str='方法的返回值必须为一个User类实例;delete方法的返回值必须是布尔数据类型';
echo substr($str,0,6).'<br>';
echo mb_substr($str,0,6).'<hr>';
使用substr函数的结果是:返回 ‘函数’两个词,UTF8下,每个汉字占三个字节,如果截取4个就乱码了。substr() 函数,它只针对英文字符
如果要分割的中文文字则需要使用 mb_substr()。

3.可变函数
如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。function getPrice(float $money,float $discount):float{
return $money*$discount;
}
$function='getPrice';
echo '最终实付'.$function(500,0.2).'<hr>';

匿名函数
以下为网络整理而得,非原创。1.简单例子
$anonymousFunc = function($username){
echo $username;
};
$anonymousFunc("乔峰!");
echo '<hr>';

2.将匿名函数放在普通函数中,也可以将匿名函数返回,:这样就构成了一个简单的闭包
function closureFunc(){
$anonymousFunc = function(){
echo "乔峰2";
};
$anonymousFunc();//普通函数内部调用了匿名函数
}
closureFunc();//输出: 乔峰2
echo '<hr>';

在匿名函数中引用局部变量(这里要引用一个php的关键字 use)
function closureFunc2(){
$username = '乔峰3';
$anonymousFunc = function() use($username){
echo $username;
};
$anonymousFunc();//此处调用了匿名函数
}
closureFunc2();//输出: 乔峰3
echo '<hr>';

4.在普通函数中返回匿名函数
function closureFunc3(){
$username = '乔峰4';
$anonymousFunc = function() use($username){
echo $username;
};
return $anonymousFunc;// 函数返回匿名函数
}
$func = closureFunc3();
$func(); //然后调用$func()
echo '<hr>';

5.返回匿名函数并给匿名函数传参
function closureFunc4(){
$username = '乔峰5';
$anonymousFunc = function($lover,$skill) use($username){
echo $username.$lover.$skill;
};
return $anonymousFunc;
}
$func = closureFunc4();
$func("阿朱","擒龙手");//乔峰阿朱擒龙手
echo '<hr>';

6.把匿名函数当作参数传递
$anonymousFunc2 = function($username){
echo $username;
};
//定义普通函数,anonymousFunc2 为参数变量
function myFunc($anonymousFunc2){
$anonymousFunc2("段誉3");
}
myFunc(function($username){ //这里调用普通函数,并把 匿名函数作为参数 传给了myFunc中的$anonymousFunc
echo $username;
});//输出 段誉3

函数返回值
重点放在多值返回1.使用字符串拼接来输出多值
function demo1():string
{
$status=1;
$message='成功';
return $status.','.$message;
};
echo demo1().'<hr>';

2.通过数组返回
function demo22():array
{
$sex='女';
$message1='小王子';
$message2='小公主';
return ['sex'=>$sex,'message1'=>$message1,'message2'=>$message2];
};
echo demo22()['sex']==='男'?demo22()['message1']:demo22()['message2'];
echo '<hr>';

3.通过Json返回 。Json是JS对象字面量的字符串表示。
function demo32():string
{
$sex='男';
$message1='小王子';
$message2='小公主';
return json_encode(['sex'=>$sex,'message1'=>$message1,'message2'=>$message2]);
//对JSON格式的字符串进行编码
};
echo demo32().'<br><br>';
echo gettype(demo32()).'<br><br>';//查看类型 返回的是字符串
print_r (json_decode(demo32())); //返回对象
echo '<br><br>';
print_r (json_decode(demo32(),true));//强制返回数组
echo '<hr>';

4.序列化方式
function demo44():string
{
$sex='男';
$message1='小王子';
$message2='小公主';
return serialize(['sex'=>$sex,'message1'=>$message1,'message2'=>$message2]);
//对JSON格式的字符串进行编码
};
echo demo44().'<br>';
//反序列化,还原
print_r(unserialize(demo44()));

函数的参数
1.值参数,这是默认
$age=12;
$num=10;
$res=function (float $number) use ($age) :float{
return $number+=$age;
};
echo '小明今年'.$age.'岁,'.'10年后他是'.$res($num).'岁<br>';
echo $num.'<hr>';

2.引用参数,需要在参数前添加地址符&
$age2=12;
$num2=10;
$res2=function (float &$number) use ($age2) :float{
return $number+=$age2;
};
echo '小明今年'.$age2.'岁,'.$num2.'年后他是'.$res2($num2).'岁<br>';
echo $num2.'<hr>';

3.默认参数。 凡是有默认值的参数,一定要写在没有默认值的参数后面。
function helloWord(float $number,string $sex='北京'):string{
return $number>18?$sex.'大人':$sex.'小孩';
};
$age3=20;
$age4=12;
echo helloWord($age3,'上海').'<br>';
echo helloWord($age4).'<hr>';

4.剩余参数
用在函数参数列表中,用来收集。function demo4(...$args){
for($i=0,$res2=1;$i<count($args);$i++){
$res2*=$args[$i];
}
return $res2; //数组求和
}
echo demo4(1,2,5,4,10);
将剩余参数用在函数的调用表达式中 是展开 $arr=[1,2,5,10];
print_r(demo4(...$arr));

函数的命名空间