PHP 基础知识:函数
1. 函数语法
//函数定义
function 函数名称(类型:参数列表):返回值类型
{
//函数体
return 返回值;
};
序号 |
名称 |
描述 |
1 |
function |
声明函数 |
2 |
函数名称 |
复合 PHP 标识符命名规范,不区分大小写 |
3 |
参数列表 |
另个或多个接收外部传入到函数的变量 |
4 |
{... |
创建出一个封闭的函数作用域 |
5 |
函数体 |
由零个或多个合法的 PHP 语句组成 |
6 |
return 值 |
将执行结果返回函数调用者[可选] |
7 |
...} |
函数执行结束,如果没有 return ,则返回 null |
2. 函数类型
序号 |
类型 |
语法 |
描述 |
1 |
自定义函数 |
function getMess(){...} |
用户根据业务需求创建 |
2 |
系统函数 |
gettype(),date() |
也叫预定义函数,不必声明直接调用 |
3 |
可变函数 |
$funcName() |
函数名使用变量表示 |
4 |
匿名函数 |
$f = function(){...} |
也叫“闭包”或“函数表达,常用做回调函数处理” |
// 1. 自定义函数
// 自定义一个函数addNmu() ,计算两数之和并返回
function myName(string $name) : string
{
return "我的名字叫做".$name;
};
// 调用并输出
echo myName('wen');
echo '<hr>';
// 2. 系统函数
//date() 获取当前系统时间
echo date('Y-m-d H:s:i');
echo '<hr>';
// 3. 可变函数
//定义一个变量等于函数名
$funcName = 'myName';
echo $funcName('yu');
echo '<hr>';
// 4. 匿名函数:又叫闭包,可以访问父作用域的变量
//形式1:父作用域是全局
$age = 18;
// 闭包访问父作用域变量格式:在参数后 加 use ($age),自定义函数访问父作用域变量使用 global $age;
$myInter = function(string $name) use ($age) : string
{
return "我的名字叫做".$name.",我今年".$age;
};
echo $myInter('goodboy');
echo '<br>';
//形式2:父作用域又是函数
$mess = function($age){
//子函数
$myInter = function(string $name) use ($age) :string
{
return "我的名字叫做".$name.",我今年".$age;
};
return $myInter;
};
//因为$mess() 返回的是一个闭包对象
//调用方法:
echo $mess(18)('goodgood');
3. 返回值
序号 |
场景 |
描述 |
1 |
return |
可以返回任何类型的值,包括函数类型 |
2 |
无return |
遇到} 也会返回,默认返回null |
//return
function addOne(int $a,int $b) : string
{
//显示返回
return "$a + $b =".($a+$b);
};
//无 return
function addTwo(int $a,int $b)
{
//隐式返回无 return
echo "$a + $b =".($a+$b);
};
序号 |
返回值类型 |
描述 |
1 |
string |
字符串拼接 |
2 |
array |
数组 |
3 |
json |
JSON 字符串 |
4 |
serialize |
序列化字符串 |
//函数返回多个值
function getData()
{
$name = 'wen';
$age = 18;
$sex = 'man';
// 1. 字符串拼接: 使用字符串拼接符 '.'
// return "姓名:".$name.",年龄:".$age.",性别:".$sex;
// 2. 数组 : array
// return ['姓名'=>$name,'年龄'=>$age,'性别'=>$sex];
// 3. JSON 字符串
// json_encode():将PHP数据编码为json格式的字符串返回
// json_decode():对json格式的字符串进行解码
// return json_encode(['姓名'=>$name,'年龄'=>$age,'性别'=>$sex]);
// 4. serialize 序列化
return serialize(['姓名'=>$name,'年龄'=>$age,'性别'=>$sex]);
};
// 返回的字符串使用 echo
// echo getData();
//返回的是数组 使用 print_r
// print_r(getData());
//使用json格式返回的数据,需要使用 json_decode() 函数进行解码,默认解析成的是对象,加参数 true 之后解析为数组
// print_r(json_decode(getData(),true));
// 使用serialize 序列化传输的数据,需要解序列化
print_r(unserialize(getData()));
json:是用 js 对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式
json 本质上就是一个具有一定结构和格式的字符串,不过这种格式得到了公认,几乎所有编程语言都有支持它的接口
json 也是一种序列化
4. 参数
- 调用者可以通过参数将数据传递到函数中
- 参数是以逗号分隔的表达式列表
- 参数按照从左到右的顺序求值
参数类型
序号 |
类型 |
描述 |
1 |
值参数 |
默认传参方式 |
2 |
引用参数 |
改变原始调用参数值 |
3 |
默认参数 |
调用时运行省略的参数 |
4 |
剩余参数 |
调用参数数量不确定 |
<?php
//函数参数
// 1. 值参数 : 默认
function demo1(float $arg) : float
{
$arg = $arg * 2;
return $arg;
};
$value = 100;
echo demo1($value),'<br>';
echo $value;
// 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo '<hr>';
// 2. 引用参数
function demo2(float &$arg) : float
{
$arg *=2;
return $arg;
}
$value = 200;
echo demo2($value),'<br>';
echo $value;
// 如果在参数前面使用了取地址符 '&',则会改变原始调用参数的值
echo '<hr>';
// 3. 默认参数:默认参数必须写在必选参数后面
function demo3(string $name,int $age,string $sex='保密') : string
{
return "我的名字叫做".$name.",我今年".$age.",我的性别".$sex;
};
echo demo3('o(∩_∩)o 哈哈',18);
echo '<hr>';
// 4. 剩余参数
//...: 参数归纳
//...:用在函数的形参列表中,表示“收集”,将多个离散的参数打包到一个数组中处理
function demo4(...$args) : float
{
$total = 0;
// 计算所有参数之和
//方法1:
// for($i = 0;$i < count($args);$i++){
// $total +=$args[$i];
// };
// 方法2:
$total = array_sum($args);
return $total;
}
// echo demo4(1,2,3,4,5);
$arr = [1,5,7,9,3,6];
// ...:用在函数的调用参数列表中,表示“展开”,还原将一个数组展开成一个个离散的值
echo demo4(...$arr);
5. 回调函数
语法 |
类型 |
执行方式 |
应用场景 |
匿名函数 |
闭包Closure |
异步 |
函数参数 |
-代码实例:
//回调函数
$date = ['html5','css3','javscript','jquery','php'];
//方式1:普通函数写法
function repeat($arr){
//把所有字符都大写
return strtoupper($arr);
}
//将用户自定义函数作用到给定数组的每个值上,返回新的值。
print_r(array_map('repeat',$date));
echo '<hr>';
//方式2:定义一个匿名函数
// ucfirst() 字符串首字母大写
$mess = print_r(array_map(function($arg){return ucfirst($arg);},$date));
6. 命名空间
- 命名空间是用来防止全局成员(函数,常量,类,接口)的命名冲突的
7. 总结
- 函数的类型中,可变函数和匿名函数也是自定义函数中的一种,自定义函数为程序能更快速,更便捷的处理数据提供了极大的自由度
- 函数返回值必须是准守单值返回的原则,多值返回也是建立在单值返回的基础之上,通过数组,数据序列化等吧数据组合在一起实现的
- 函数剩余参数归纳,适用于所有自定义函数参数
- 回调函数:用在函数的参数中