一、函数的声明与调用
函数的含义:
- 代码复用的重要手段
函数名称以字母或下划线开头(不能以数字开头),标识符必须满足php标识符的基本要求,只允许字母数字或下划线且不允许数字开头
function 函数名称标识符(参数){
执行语句,也可以为空
return 将函数的执行结果返回到调用者
}
调用:按名称调用
<?php
function modf (int $a,int $b){
return $a % $b;
}
echo modf(7,3);
二、函数的类型
1.自定义函数:由用户自定义函数,用户自己取函数名
<?php
function show (int $d):string{
if ($d >=6){
return '今天休息';}
else
return '今天上班';
}
echo show(5);
2.系统函数:php内置的函数,php实现写好的了,直接使用
<?php
$str ="sdfEERR";
//全部转为小写
echo strtolower($str);
系统函数函数 | 功能 |
---|---|
substr | 字符串截取 |
mb_substr | 多字节截取 |
3.可变函数(函数名是变量)
<?php
// 可变函数,把函数名变为一个变量
function username(string $name)
{
return $name;
}
$var = 'username';
// 普通用函数名调用函数
echo username('admin'),'<hr>';
// 用可变函数变量名调用,即用$var中的值代替了函数名调用函数
echo $var('master'),'<hr>';
4.匿名函数/闭包
拥有名称的函数叫:命名函数/具名函数
无名的叫匿名函数
匿名函数/闭包,在php中也称为闭包,可以访问父作用域中的变量 function (参数) use ($外部变量){
}
- 常规匿名函数
<?php
$tax =function(float $money ,float $t):float
{
return $money * $t ;
};
echo "个人所得税应缴:" . $tax(18000,0.05).'元';
- 匿名函数可以访问父作用域中的变量,当父作用域是全局时,用匿名函数可以访问全局变量
<?php
$passlevel = 60;
// 这是一个全局变量
$test = function(int $level) use($passlevel):string
{
if ($level > $passlevel)
return "恭喜通过测试";
else
return "要继续加油哦";
};
echo $test(59),'<hr>';
//这里函数只需要输入一个参数就可以完成,比较的值是全局变量中设置的,如果标准改为70合格,也不用改函数的代码
- 匿名函数可以访问父作用域中的变量,当父作用域是父函数时,用匿名函数可以访问是父函数作用域中的变量
<?php
$pass = function ($passlevel) {
// 当父作用域是父函数时passlevel是父函数的变量
$test = function(int $level) use($passlevel):string
{//使用匿名函数访问父作用域中的变量时,一定要在匿名函数后面加上"use(父作用域中的变量)
if ($level > $passlevel)
return "恭喜通过测试";
else
return "要继续加油哦";
};
return $test;
};
echo $pass(60)(70),'<hr>';
//这里函数只需要输入两个参数才可以完成,调用父函数名就行,第一个参数是父函数的参数,设置及格线,第二个括号中的参数是给子函数的,设置判断的分数
三、函数的返回值
函数必须要有返回值
函数只能返回单一的值
重点放在多值返回
返回值:
1.通过连接.拼接返回
2.通过数组返回
3.通过json返回,json是js对象自变量的字符串表示json_encode<->json_decode
4.序列化serialize方式返回值,serialize<->unserialize
<?php
// 1.字符串拼装
function test1(): string{
$name = 'admin';
$code = '通过验证';
return $name . $code;
}
echo test1(),'<hr>';
// 2.通过数组返回
function test2():array
{
$str1 = 'nanjing';
$str2 = 'beijing';
return ['point1' => $str1,'point2' => $str2];
}
print_r(test2());
echo '<hr>';
// 3.通过json返回,json是js对象字面量的字符串表示json_encode<->json_decode
function test3():string{
$code = 1;
$message = '登录成功';
return json_encode(['code'=>$code,'msg'=>$message]);
//返回以json格式封装的字符串
}
// 还原后变为json的对象
print_r(json_decode(test3()));
echo '<hr>';
// 4.序列化serialize方式返回,serialize<->unserialize
function test4():string
{
$username = 'emagic';
$sex = '男';
return serialize(['username' => $username,'sex' => $sex]);
}
echo test4(),'<br>';
//返回的是序列化编码的格式数据
print_r(unserialize(test4()));
// 反序列化后还原为数组
echo '<hr>';
四、函数中的参数
1.值参数(默认)
2.引用参数:要在参数前添加区地址符&
,函数内部对参数的更新实时映射到外部实际参数
3.默认参数:即便用户不给参数的时候就给定参数一个默认取值,避免函数报错
- 凡是有默认值的参数必须写到没有默认值参数的后面
4.剩余参数:如调用参数的数量不固定(…$args)
- 剩余参数用在函数的参数列表中:收集
- 剩余参数用在函数的调用表达式中,是展开
- array_sum为数组求和函数
5.回调函数,匿名函数,闭包
- 异步编程中的函数的参数
- 当函数的执行的时间和顺序无法预测时,通过事件或者回调来执行函数
- 它的执行由父函数决定何时调用
<?php
// 值参数,默认方式
function modf (int $a,int $b){
return $a % $b;
}
echo modf(7,3);
echo '<hr>';
// 默认参数:即便用户不给参数的时候就给定参数一个默认取值,避免函数报错
function getusername(string $username = 'admin'):string
{
return $username;
}
// 调用时不传参数会输出默认参数值
echo getusername(),'<hr>';
// 引用参数,在参数前面加上取地址符&
function reffunc(&$parm1)
{
return $parm1 *= 2;
//加上取地址符后的参数,其值变化也会使函数外部的值产生变化
}
$parm2 = 50; //parm2初始化是给50
echo reffunc($parm2),'<br>';
echo $parm2; //这里的parm2输出结果变为了100,不再是50了
echo '<hr>';
// 剩余参数
// 当调用得参数 数量不确定时 参数前面加三个...
function uncountable(...$args)
{
return array_sum($args);
//array_sum为数组求和函数
}
$res = uncountable(1,2,3,4,5,6,7,8,9,10);
print_r($res);
五、命名空间
<?php
// 函数的命名空间
// 1. 命名空间
namespace ns1{
function calc(int $a, int $b):int
{
return $a * $b;
}
}
// 这里分别在两个不同的空间ns1和ns2命名了一个同名的calc函数,解决了命名冲突问题
namespace ns2 {
function calc(int $a, int $b):int{
return $a + $b;
}
}
// 2. 全局空间中访问
namespace{
echo ns1\calc(3,5);
echo '<hr>';
echo ns2\calc(3,5);
}