函数类型
1.自定义函数
//通过function关键字自定义了一个houMuch()函数
function houMuch( int $money ,int $pay):int
{
return $money - $pay ;
}
echo houMuch(80,20);
2.系统函数
$sty='php中文网原创视频。';
//利用系统函数获取字符串截取,获取字符串前五个字符
//mb_substr( 要截取的字符串,起始位置,截取长度);
echo mb_substr( $sty,0,5);
3.可变函数
function houMuch( int $money ,int $pay):int
{
return $money - $pay ;
}
//把函数名称 放在一个变量里,调用变量名。
$str = 'houMuch';
echo $str( 100 ,20);
4.匿名函数
$zhekou = 0.9;
//通过use关键字来访问函数外部的全局作用域
$houMuch= function ( int $money ,int $pay) use ($zhekou):int
{
return $money - ($pay>=500?$pay * $zhekou : $pay) ;
};
echo '剩余金额:'. $houMuch(2000,300) ;
//如果父作用域也是一个函数
$houMuch = function($zhekou=0.9)
{
//子作用域可继承父作用域的变量
return function ( int $money ,int $pay) use ($zhekou):int
{
return $money - ($pay>=500?$pay * $zhekou : $pay) ;
};
};
echo '剩余金额:'. $houMuch(0.5)(2000,500) ;
返回值
1.字符串拼装
// 适合处理大量的php+html混写
// 这种返回的格式是用户自定义的,前端处理非常麻烦
function user():string
{
$name= '毛毛';
$age = 19;
return $name .':'. $age.'岁' ;
}
echo user();
2. 通过数组返回
function demo1 (): array
{
return ['name'=>'毛毛','age'=>20] ;
}
//通过printf()格式化打印数据
//%s占位符
printf('<pre>%s</pre>',print_r(demo1(),true));
3.JSON字符串
通过JSON返回:
json:是用js对象字面量 的方式来表示数据,是一种轻量级通用的数据交换或传输格式
json本质上就是一个具有一定结构和格式的字符串,不过这种格式得到了公认,几乎所有编程语言都支持它的借口
function demo2 (): string
{
// json_encode()将php数据编码为json格式的字符串返回
return json_encode(['name'=>'毛毛','age'=>20]) ;
}
//将json格式的字符串还原为php对象/数组
//json_decode(); 默认返回一个Object对象类型,第二个参数为true时, 返回一个数组类型
print_r(json_decode(demo2()));
echo '<br>';
print_r(json_decode(demo2(),true));
4.序列化:字符串
function demo3 (): string
{
//通过serialize()序列化数组
return serialize(['name'=>'毛毛','age'=>20]) ;
}
echo demo3();
// 通过unserialize();反序列化才可以使用
// echo unserialize(demo3());
// echo print_r(unserialize(demo3()),true);
printf('<pre>%s</pre>',print_r(unserialize(demo3()),true));
函数参数
1.值参数,默认
function demo1(float $a)
{
return $a *= 2;
}
$value = 100;
echo demo1($value).'<br>';
//在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo $value;
2. 引用传递
//如果在参数前面使用了取地址符“&”,则会改变原始调用参数的值
function demo2(float &$a)
{
return $a *= 2;
}
echo demo2($value).'<br>';
echo $value;
3.默认参数
//默认参数必须写在必选参数的后面
function demo3(float $a ,float $b , string $opt = '+')
{
$c = 0 ;
switch ( $opt) {
case '+':
$c = "$a + $b =".($a + $b) ;
break;
case '-':
$c = "$a - $b =".($a - $b) ;
break;
case '*':
$c = "$a * $b =".($a * $b) ;
break;
case '/':
$c = "$a / $b =".($a / $b) ;
break;
default:
$c = '非法操作符';
}
return $c;
}
echo demo3(10,20).'<br>';
echo demo3(10,20,'/').'<br>';
echo demo3(10,20,'#').'<br>';
4.剩余参数
function demo4(float $a ,float $b , float $c):float
{
return $a+ $b+ $c;
}
echo demo4(1,2,3).'<br>';
function demo5()
{
//参数数量
// return func_num_args();
// 根据索引返回指定的调用函数
//return func_get_arg(2);
//返回一个数组
//return func_get_args();
$c = 0;
for ($i=0; $i <func_num_args(); $i++) {
$c += func_get_arg($i);
}
return $c;
}
function demo6()
{
$c = 0;
foreach (func_get_args() as $value) {
$c += $value;
}
return $c;
}
// echo demo5(1,2 ,3,4,8,7,9);
// print_r(demo5(1,2,3,4,5));
echo demo5(2,2,10).'<br>';
echo demo6(2,2,10,10).'<br>';
echo '<hr>';
//使用剩余参数简化
// “ ... ”参数归纳符
function demo7(...$str):float
{
// array_sum(): 参数相加, array_product() :参数相乘
return array_sum($str);
// return array_product($str);
}
echo demo7(2,2,10,10).'<br>';
$arr = [10,20,30,40,50,60];
print_r(demo7(...$arr));
/*“ ... ”
1.用在函数形式参数列表中,表示收集,将多个离散的参数打包到一个数组中处理
2.用在函数的调用参数列表中,表示展开,还原将一个数组展开成一个个离散的
*/