php的函数
function 函数名(参数列表) {
函数体;由一条或多条语句组成,也可以为空
}
// 调用函数
函数名();
例:
// 括号中的int是规定参数类型必须是整数型,:int是规定返回值必须是整数型
function demo(int $a,int $b):int{
// 将函数的执行结果返回到调用者
return $a + $b;
}
// 调用函数
// 按名称调用
// 参数类型限制就是变量类型强制转换,把传递的参数转为整数型数值,如参数中有不可转为整数型数值的参数直接报错
// 返回值类型限制相同
echo demo(1,7); // 输出结果 8;
系统小函数:count():返回数组中元素的数目[就是数数组中的元素个数]
例:
echo count([1,2,3]); // 输出 3;
1.自定义函数
例:
// $price价钱 $discount:折扣
function TOTAL_PRICE(float $price,float $discount):float {
return $price *= $discount; // 等同于$price = $price * $discount;
}
echo '实付钱='.TOTAL_PRICE(3000,0.8); // 输出 24000;
2.系统函数(很多可自行查阅手册,下方只是一个小例字)
// 系统函数字符串截取函数mb_substr(截取变量名,截取开始数值,截取结束数值);
$str = "函数调用机制,改进函数调用机制,通过优化参数传递环节,减少了一些指令";
echo mb_substr($str,0,6); // 输出"函数调用机制"
3.可变函数
// 将函数名作为变量值,通过变量名实现调用函数
例:
// $price价钱 $discount:折扣
function TOTAL_PRICE(float $price,float $discount):float {
return $price *= $discount; // 等同于$price = $price * $discount;
}
// $demo的值就是函数名可以直接通过这个变量值来调用TOTAL_PRICE这个函数
$demo = 'TOTAL_PRICE';
echo '实付金额='.$demo(1000,0.5),'<br>'; // 输出 5000;
4.匿名函数
// 拥有名称的函数叫做命名函数/或具名函数
// 顾名思义无名称的函数就叫匿名函数
// 匿名函数用个变量来承接
// 注意匿名函数的结尾括号后面有个分号
$变量名 = function (参数列表) {
函数体;
}
例:
$get = function (float $price,float $discount):float {
return $price *= $discount;
};
echo '实付金额='.$get(500,0.9); // 输出 450;
5.匿名函数访问父作用域中的变量
例:
// 这个父作用域是全局作用域
$discount = 0.5;
$pay = function (float $price,float $number)use($discount):float {
// 总价
$total_price = $price * $number;
// 使用三元运算根据总价钱判断打折
return $total_price > 2000 ? $total_price *= $discount : $total_price;
};
// 调用匿名函数
echo '实付金额='.$pay(600,3); // 输出 "1800" 总价钱不够打折
例:
// 父作用域是父函数
$f = function($discount){
$pay = function (float $price,int $number)use($discount):float {
// 总价
$total_price = $price * $number;
// echo $total_price;
// 使用三元运算根据总价钱判断打折
return $total_price > 2000 ? $total_price *= $discount : $total_price;
};
// 将子函数以返回值得方式返给调用者
return $pay;
};
echo '实际支付金额='.$f(0.5)(1000,5); // 输出 "2500"
理解$f(0.5)(1000,5):$f(0.5); $pay(1000,5);
函数的返回值
函数只能返回单一的值
1.多值通过字符串拼装返回
例:
function demo1():string {
$success = 1;
$defeated = '失败';
return $success.'<span style="color:blue">'.$defeated.'</span>';
}
echo demo1(); // 输出结果 1失败[这个失败是有蓝色字体样式的]
2.多值通过数组返回给调用者
例:
function demo2():array {
$success = 1;
$defeated = '失败';
return ['success'=>$success,'defeated'=>$defeated];
}
// 通过关联数组的键值来调用输出指定数组元素
echo demo2()['success']; // 输出1 success的值就是1
3.通过json来返回值
json_encode(数组); 将数组已字符串的形式返回
json_decode(); 将对JSON格式的字符串转为数组格式
例:
function demo3():string{
$success = 1;
$defeated = '失败';
// json_encode(数组); 将数组已字符串的形式返回
return json_encode(['success'=>$success,'defeated'=>$defeated]);
}
echo demo3(); // 输出 {"success":1,"defeated":"\u5931\u8d25"}
解释:输出中的\u5931\u8d25就是失败两个字
// 输出查看当前函数值的输出类型
echo gettype(demo3()),'<hr>'; // 输出 string 字符串型
// 将对JSON格式的字符串转为数组格式
print_r(json_decode(demo3(),true));
4.序列化方式
serialize(要序列化的数组名称) 用于序列化对象或数组,并返回一个字符串
反序列化: 还原[将被序列化成字符串格式的对象或数组,还原为数组格式]
unserialize(被序列化成字符串格式的对象或数组)
例:
function demo4():string {
$success = 1;
$defeated = '失败';
return serialize(['success'=>$success,'defeated'=>$defeated]);
}
echo demo4(); // 输出 "1失败" 字符串类型
echo gettype(demo4()); // 输出查看类型 string
// 反序列化
print_r(unserialize(demo4())['success']); // 输出 "1" 在数组中的键值为success
php函数中的参数
1.值参数(也是默认参数)
例:
// $arg是形参
function demo1(float $arg):float {
return $arg *= 2;
}
// 参数
$val = 10;
echo demo1($val); // $val是实参 // 输出结果 20
2.引用参数
例:
// &:取地址符 这里的实参引用了实参的值存储地址
function demo2(float &$arg):float {
return $arg *= 2;
}
$val = 200;
echo demo2($val),'<br>';
// 输出这里查看$val有没有随着$arg值得变化而变化
echo $val; // 输出400 值随着形参$arg的变化而发生变化
3.默认参数
默认参数必须写在没有默认参数的后面
例:
function demo3(float $a,float $b,string $c ='+') {
// 定义一个变量承接结果
$res = '';
switch ($c) {
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 = '非法值';
break;
}
return $res;
}
// 默认
echo demo3(2,3),'<br>'; // 输出5 "进入假发运算中"
// 条件减号
echo demo3(2,3,'-'),'<br>'; // 输出-1 "进入了减法运算中"
// 条件非法
echo demo3(2,3,'&'); // 输出 "非法值" 因为非法制没有这个符号
4.剩余参数
作用:剩余参数用在函数的参数列表中: 收集;所有传入函数的参数放入一个数组中
// 剩余番薯用在函数的形参(函数列表中)中
例:
function demo4(...$args) {
return $args;
}
print_r(demo4(1,2,3,4,5)); // 输出数组[1,2,3,4,5]
// 剩余参数用在实参中
// 将剩余参数用在函数的调用表达式中, 是: 展开
例:
function demo5(...$args) {
// array_sum();数组求和
return array_sum($args);
}
$arr = [1,2,3,4,5,6,7];
// 直接将一个数组一剩余参数的形势传入函数中进行求和运算
$res = demo5(...$arr);
print_r($res); // 输出 27 数组元素值的总和
回调函数.匿名函数,闭包
array_map(回调函数名/回调函数,数组);
例:
$data = range(1,100);
$func = function($item) {
if ($item % 2 === 0) return $item;
};
$arr = array_map($func,$data);
echo '<pre>';
print_r($arr);
echo '</pre>';
// 或简写[就是直接把匿名函数放进去]
$data = range(1,100);
$arr = array_map(function($item){
if ($item % 2 === 0) return $item;
}, $data);
print_r($arr);
// array_filter(数组,回调函数名/回调函数);该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回给结果数组。数组键名保持不变。
// 去除数组中的空值
例:
$data = range(1,100);
$arr = array_map(function($item){
if ($item % 2 === 0) return $item;
}, $data);
$res=array_filter($arr, function($item){
return $item;
});
//
echo '<pre>';
print_r($res);
echo '</pre>';
函数的命名空间
例:
// 声明命名空间ns1并把函数demo1写入
namespace ns1 {
function demo1() {
return __FUNCTION__;
}
}
// 调用命名空阿ns1中的demo1()
namespace {
function demo2(){}
echo ns1\demo1(); // 输出ns1\demo1
}