函数
[toc]
1. 语法
函数是实现代码复用的重要方式,在所有编程语言中均如此
function 函数名称(类型: 参数列表): 返回值类型
{
// 函数体
return 返回值;
}
序号 |
名称 |
描述 |
1 |
function |
声明函数 |
2 |
函数名称 |
符合 PHP 标识符命名规范,不区分大小写 |
2 |
参数列表 |
零个或多个接收外部传入到函数的变量 |
2 |
{... |
创建出一个封闭的函数作用域 |
2 |
函数体 |
由零个可多个合法的 PHP 语句组成 |
2 |
return 值 |
将执行结果返回函数调用者[可选] |
2 |
...} |
函数执行结束,如果没有return ,则返回null |
2. 类型
序号 |
类型 |
语法 |
描述 |
1 |
自定义函数 |
function getName(){...} |
用户根据业务需求创建 |
2 |
系统函数 |
substr(), count()... |
也叫预定义函数,不必声明直接调用 |
3 |
可变函数 |
$funcName(); |
函数名使用变量表示 |
4 |
匿名函数 |
$f = function (){...} |
也叫”闭包”或”函数表达式”,常用做回调处理 |
<?php
//1、自定义函数
function add(int $a,int $b) : int
{
return $a+$b;
}
//2、系统函数
//3、可变函数
function multiply(int $a,int $b) : int
{
return $a*$b;
}
$func_name = 'add';
echo $func_name(3,2).PHP_EOL;
$func_name = 'multiply';
echo $func_name(3,2).PHP_EOL;
//4、匿名函数(也叫闭包, 可以访问父作用域的变量)
$num = 100;
$getNum = function() use($num) : int
{
return $num;
};
echo $getNum().PHP_EOL;
$f = function($a){
return function($x,$y) use($a){
return $x*$y*$a;
};
};
echo $f(10)(20,30);
3. 返回值
序号 |
场景 |
描述 |
1 |
return |
可以返回任何类型的值,包括函数类型 |
2 |
无return |
遇到} 也会返回, 默认返回null |
序号 |
返回值类型 |
描述 |
1 |
string |
字符串拼接 |
2 |
array |
数组 |
3 |
json |
JSON 字符串 |
4 |
serialize |
序列化字符串 |
json 和序列化,使用时需要进行解码操作
4. 参数
- 调用者可以通过参数将数据传递到函数中
- 参数是以逗号分隔的表达式列表
- 参数按照从左到右的顺序求值
参数类型
序号 |
类型 |
描述 |
1 |
值参数 |
默认传参方式 |
2 |
引用参数 |
改变原始调用参数值 |
3 |
默认参数 |
调用时允许省略的参数 |
4 |
剩余参数 |
调用参数数量不确定 |
<?php
function sum() :int
{
$sum = 0;
if(func_num_args()>0){
foreach(func_get_args() as $v){
$sum += $v;
}
}
return $sum;
}
// echo sum(1,2,3,4,5);
function sum2(...$args) :int
{
return array_sum($args);
}
$arr = [1,2,3,4,5,6];
// echo sum2(...$arr);
$arr = ['aba',22,'man'];
list($name,$age,$sex) = $arr;
// echo "姓名:$name,年龄:$age,性别:$sex".PHP_EOL;
list($name1,,$sex1) = $arr;
// echo "姓名:$name1,性别:$sex1";
$user[] = [100, 'admin', 90];
$user[] = [110, 'peter', 60];
$user[] = [120, 'jack', 98];
// 数组解包
// js中解构赋值, php中也有解构
foreach ($user as list($id, $name)) {
printf('id=%s, name=%s ', $id, $name);
}
5. 回调函数
语法 |
类型 |
执行方式 |
应用场景 |
匿名函数 |
闭包Closure |
异步 |
函数参数 |
异步执行,是指当前函数的执行并不会中断当前程序的执行流程
```
---
## 6. 命名空间
- 使用目录来整理文档, 允许将同名文档,存储在不同的目录下面即可
- 不同目录下的同名文件,访问时必须带上的它的目录名称,以未区别
- 命名空间采用类似的思想,同名函数,只要声明在不同空间中即可
- 同样, 访问这些函数时, 也需要带上它的命名空间才可以
```php
<?php
// 函数的命名空间
// 命名空间是防止全局员成的命名冲突的
// 全局成员: 函数, 常量, 类, 接口
namespace ns1
{
function demo1() : string
{
return __FUNCTION__;
}
}
namespace ns2
{
function demo1() : string
{
return __FUNCTION__;
}
}
// 全局空间
namespace
{
echo \ns1\demo1();
echo '<hr>';
echo \ns2\demo1();
}