1. 函数的参数与返回值
- 函数是全局成员 不受作用域限制。
- php函数的作用:完成特定功能的代码块,封装成函数可以实现复用性,提高代码的可维护性。
- php内置了上千种函数可供我们直接调用,函数库文件已经编译到我们所使用的发行版中了,可以直接指定函数名称来调用,当然我们也可以自定义函数来完成特定功能。
- 函数的命名规则基本和变量的命名规则一直,可以以字母或下划线开头,后跟字母数字或下划线,但不能以数字开头,函数不区分大小写。
- 函数有三大要素 参数,返回值,函数体
- php函数语法:
function 函数名称([ 参数类型限定 参数列表]) :返回值类型
{
函数体
return 返回值
- 函数只能返回单一的值,返回值的数据类型可以是任意类型
- 函数碰到return语句,立即结束程序执行,
return后面的代 码不会被执行
}
- 参数:可选的,对外提供一个接口,供函数调用者按照自己的意愿改变函数体内的执行行为
- 参数 形参 实参
- 默认参数:有默认值的参数,如果不传参或者少传参数,就会默认参数的值
- 参数是从左往右求值,所以默认参数放到最右边
- 参数按引用传,在变量前加&符号,引用的变量值变化,原变量就会变化
<?PHP
// 不同的脚本不能有同名函数,同名函数要放在不同命名空间
namespace spaceOne {
$money = 8000;
$pay = 1800;
// 定义的函数可在定义语句前面调用
echo payment($money, $pay);
// 参数加&为引用原变量,运算后值会变
function payment(&$money, $pay, $paymentWay = '支付宝')
{
$money = $money - $pay;
return "通过{$paymentWay}支付了{$pay}元,余额{$money}元。<br>";
}
$pay = 2800;
echo payment($money, $pay);
$pay = 850;
$paymentWay = '微信';
echo payment($money, $pay, $paymentWay);
}
namespace spaceTwo {
$state = true;
// say(); 函数还没执行定义,在此处调用会出错。
if ($state) {
function payment()
{
return '我们在学习PHP。';
}
}
echo payment();
}
返回值
<?PHP
// !函数返回值
function arr()
{
return [3, 6, 9];
}
[$a, $b, $c] = arr();
echo ($a + $b + $c);
// !接口开发 函数返回值会转为通用的json格式的数据返回,这样以来就可以和其他的编程语言进行数据交互,例如js与java php python
function login(): string
{
$loginMsg = ['status' => 1, 'msg' => '登录成功!'];
return json_encode($loginMsg, 320);
}
$lgoinMsg = login();
var_dump($lgoinMsg);
var_dump(json_decode($lgoinMsg));
2. 匿名函数、闭包
<?PHP
/*
*特殊形式的函数
* 1.匿名函数(闭包函数)
* 2.回调函数
* 3.递归函数
*
*/
// 匿名函数(闭包函数)
$praise = function ($mascot) {
return "每个人都喜欢{$mascot}。<br>";
};
echo $praise('冰敦敦');
// 全局变量是指声明在函数外部的变量,在函数内部访问不到。
// 局部变量是指声明在函数内部的变量,只能在函数内部被访问到。
// 定义全局变量
$mascot1 = '冰敦敦';
$mascot2 = '雪融融';
// 定义函数
function praise()
{
// 下面语句是错误的,无法访问外部变量
// return "每个人都喜欢{$mascot}。<br>";
// 用global访问
global $mascot1;
// 用超全局数组$GLOBALS $_GET $_POST
return "每个人都喜欢{$mascot1}和{$GLOBALS['mascot2']}。<br>";
}
echo praise();
// 闭包用关键字use使用全局变量
$praise = function ($city) use ($mascot1, $mascot2) {
return "{$mascot1}和{$mascot2}是{$city}冬奥会的吉祥物。<br>";
};
echo $praise('北京');
// 通过引用传递,闭包可改变变量值
$praise = function ($mascot) use (&$mascot1) {
$mascot1 = $mascot;
};
$praise('熊猫');
echo $mascot1;
3. 回调函数
- 回调函数:php回调是指在主线程函数执行的过程中,突然跳去执行设置的回调函数,回调函数执行结束后, 再回到主线程处理接下来的流程
- 匿名函数最通常作为回调函数的参数使用
- php脚本是单线程,脚本是同步执行的,如果遇到耗时函数将会发生线程阻塞的问题,应该将它改为异步回调的方式执行
<?PHP
// 回调函数
// 定义匿名函数,把数组中的偶数筛选出来,组成一个新数组
$odd = function (array $arr) {
// 遍历数组
for ($i = 0; $i < count($arr); $i++) {
// 判断为偶数,组成新数组
if ($arr[$i] % 2 == 0) {
$newArr[] = $arr[$i];
}
}
return $newArr;
};
$arr = [2, 35, 22, 26, 27, 29, 28, 223, 226, 228, 225, 269, 248, 239, 2310, 2564, 2351, 2258];
// 定义函数,求数组中偶数的各
// 函数第1个参数为函数,第2个参数为数组
function sum(Closure $f, array $arr)
{
return array_sum($f($arr));
}
echo sum($odd, $arr) . '<br>';
// 使用call_user_func()把第一个参数作为回调函数调用,后面是参数
echo 'call_user_func函数' . call_user_func('sum', $odd, $arr) . '<br>';
// 调用匿名函数
var_dump(call_user_func($odd, $arr));