服务端 - PHP - 函数
一、语法
函数是实现代码复用的重要方式,在所有编程语言中均如此
function 函数名称(类型: 参数列表): 返回值类型
{
// 函数体
return 返回值;
}
序号 |
名称 |
描述 |
1 |
function |
声明函数 |
2 |
函数名称 |
符合 PHP 标识符命名规范,不区分大小写 |
2 |
参数列表 |
零个或多个接收外部传入到函数的变量 |
2 |
{... |
创建出一个封闭的函数作用域 |
2 |
函数体 |
由零个可多个合法的 PHP 语句组成 |
2 |
return 值 |
将执行结果返回函数调用者[可选] |
2 |
...} |
函数执行结束,如果没有return ,则返回null |
二、类型
序号 |
类型 |
语法 |
描述 |
1 |
自定义函数 |
function getName(){...} |
用户根据业务需求创建 |
2 |
系统函数 |
substr(), count()... |
也叫预定义函数,不必声明直接调用 |
3 |
可变函数 |
$funcName(); |
函数名使用变量表示 |
4 |
匿名函数 |
$f = function (){...} |
也叫”闭包”或”函数表达式”,常用做回调处理 |
三、返回值
序号 |
场景 |
描述 |
1 |
return |
可以返回任何类型的值,包括函数类型 |
2 |
无return |
遇到} 也会返回, 默认返回null |
序号 |
返回值类型 |
描述 |
1 |
string |
字符串拼接 |
2 |
array |
数组 |
3 |
json |
JSON 字符串 |
4 |
serialize |
序列化字符串 |
json 和序列化,使用时需要进行解码操作
四、参数
- 调用者可以通过参数将数据传递到函数中
- 参数是以逗号分隔的表达式列表
- 参数按照从左到右的顺序求值
参数类型
序号 |
类型 |
描述 |
1 |
值参数 |
默认传参方式 |
2 |
引用参数 |
改变原始调用参数值 |
3 |
默认参数 |
调用时允许省略的参数 |
4 |
剩余参数 |
调用参数数量不确定 |
五、知识点
1. 闭包
- 闭包也叫匿名函数。即在一个函数(没有指定名称)中定义一个子函数(没有指定名称),子函数使用use关键字操作父作用域的变量并返回。这样就能保存所在代码块上下文的值,匿名函数经常被用作为回调函数(callback)参数的值使用。
<?php
echo '<h3>'.'一、作为变量赋值'.'</h3>';
$getName = function($name) {
return $name;
};
echo $getName("小明");
echo "<hr>";
echo '<h3>'.'二、从父作用域继承变量'.'</h3>';
$sum2 = function($n1) {
return function($n2) use ($n1) {
$n3 = $n2 + $n1;
return $n3;
};
};
$a1 = $sum2(1)(2);
$a2 = $sum2(4)(8);
echo $a1;
echo "<br>";
echo $a2;
?>
2. 回调函数
<?php
/**
* Created by VS Code
* User: John-PC
* Date: 2020/4/22
* Time: 11:25
* content: 缺少OO应用
*/
echo '<h3>'.'一、无参数回调'.'</h3>';
//回调函数
function callback1() {
echo "这是回调函数执行的结果".'<br>';
}
//主函数
function main($callback1) {
echo "这是主函数执行的结果1".'<br>';
$callback1();
echo "这是主函数执行的结果2".'<br>';
}
//主函数中调用回调函数,可以发现主线程在执行过程中执行了回调函数,等到回调函数执行完毕之后,再回到主线程处理接下来的流程
main('callback1');
echo "<hr>";
echo '<h3>'.'二、全局回调函数'.'</h3>';
echo '<p>'."系统调用用户自定义的函数,必须要通过一个代理函数来调用,叫间接调用,也叫回调".'</p>';
//定义一个回调函数并赋值给一个变量
function callback2($n1, $n2) {
$n3 = $n1 + $n2;
echo $n3;
}
$f = 'callback2';
//使用call_user_func()函数
call_user_func($f, 1, 2);
echo '<br>';
//使用call_user_func_array()函数
call_user_func_array($f, [3, 4]);
echo "<hr>";
echo '<h3>'.'三、使用匿名函数作为参数的回调函数'.'</h3>';
//自定义函数
function callback3($n1, $n2) {
$n3 = $n1 + $n2;
echo $n3;
}
function main1($callback) {
$callback(5, 6);
echo "是使用自定义函数调用回调函数后返回的结果";
}
$f1 = 'callback3';
main1($f1);
echo '<br>';
//系统内置函数
call_user_func($f1, 7, 8);
echo "是使用系统内置函数调用回调函数后返回的结果";
?>
3. 操作引用变量
<?php
//在函数中改变了调用参数的值会改变原始调用参数的值
$name = '小明';
function changeName(&$a) {
$a = '小红';
}
changeName($name);
echo $name;
?>
4. 默认参数
<?php
//默认参数不能出现在必选参数的前面,必须写在必选参数的后面
function div($n1, $n2, $n3=2) {
$total = $n1 + $n2;
return $total / $n3;
}
echo div(10, 10);
?>
5. 剩余参数
5.1 使用内置函数获取实参列表
$name = '小明';
$sex = "男";
$age = 16;
$phone = 13781235421;
$email = "xiaoming@qq.com";
function getData1() {
foreach (func_get_args() as $value) {
echo $value.'<br>';
};
}
getData1($name, $sex, $age, $phone, $email);
5.2 打包
$name = '小明';
$sex = "男";
$age = 16;
$phone = 13781235421;
$email = "xiaoming@qq.com";
function getData2(...$args) {
foreach ($args as $value) {
echo $value.'<br>';
};
}
getData2($name, $sex, $age, $phone, $email);
5.2 解包
echo '<h4>'.'1. 使用占位符'.'</h4>';
$data = ["小明", "男", 16, 13781235421, "xiaoming@qq.com"];
$printData = function ($name, $sex, $age, $phone, $email) {
echo $name.'<br>';
echo $sex.'<br>';
echo $age.'<br>';
echo $phone.'<br>';
echo $email.'<br>';
};
$printData(...$data);
echo '<h4>'.'2. 使用list()函数'.'</h4>';
$data = ["小明", "男", 16, 13781235421, "xiaoming@qq.com"];
list($name1, $sex1, $age1) = $data;
echo $name1.'<br>';
echo $sex1.'<br>';
echo $age1.'<br>';
六、命名空间
<?php
namespace obj1 {
$name = '小明';
$sex = "男";
$age = 16;
$phone = 13781235421;
$email = "xiaoming@qq.com";
function getData() {
foreach (func_get_args() as $value) {
echo $value.'<br>';
};
}
getData($name, $sex, $age, $phone, $email);
echo '<hr>';
}
namespace obj2 {
$name = '小明';
$sex = "男";
$age = 16;
$phone = 13781235421;
$email = "xiaoming@qq.com";
function getData(...$args) {
foreach ($args as $value) {
echo $value.'<br>';
};
}
getData($name, $sex, $age, $phone, $email);
}
?>
七、课程总结
- 今天学习了 PHP 的函数,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了多值返回,闭包和回调、引用参数、默认参数和剩余参数以及命名空间的基本的用法。