1.函数的声明与调用
//函数是代码复用的重要手段, 函数是通过调用来执行的,函数命名要有意义,函数名以数字或下划线开头(不能以数字开头):
function 函数名称的标识符(参数列表) {
函数体,由一条或多条语句组成,也可以为空
}
//示例:
//声明函数demo
function demo($arg){
echo "{$arg}";
}
//调用函数
demo($arg='hello world'); //输出hello world
2.函数的类型
- 自定义函数
- 系统函数
- 可变函数
- 匿名函数
示例:
//1.自定义函数
//在PHP7,一个新的功能,返回类型声明已被引入。返回类型声明指定一个函数返回值的类型
function getnum($arg, $arg1): float
{
return $arg + $arg1;
}
echo '输出:' . getnum(11.1, 12) . '<hr>';
// 2. 系统函数,php内置的函数,可以直接使用
$pwd = '12345678';
//内置的加密算法函数
echo hash('md5', $pwd) . '<br>';
echo sha1($pwd) . '<hr>';
//3. 可变函数,是把函数名变为另一个变量的值
function add($arg, $arg1): float
{
return $arg + $arg1;
}
$func = 'add';
echo $func(2, 4) . '<hr>';
//4. 匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值
$demo = function ($str) {
printf("Hello %s <br>", $str);
};
$demo('World');
//闭包可以从父作用域中继承变量。任何此类变量都应该用 use 语言结构传递进去
//当父作用域是全局时
$num = 2;
$p = function ($arg) use ($num): float {
return $arg * $num;
};
echo '输出结果:' . $p(3.5) . '<br>';
//父作用域是父函数
$data = [
['name' => 'jack', 'score' => 99],
['name' => 'Anastasia', 'score' => 40],
['name' => 'Abraham', 'score' => 80],
['name' => 'Alexander', 'score' => 59],
];
$f = function ($data) {
//在匿名函数后面加上"use(父作用域中的变量)"
$p = function ($line) use ($data) : array {
foreach ($data as $item) {
$str[] = [
'name'=> $item['name'],'result'=>($item['score'] > $line) ? '合格' : '不合格'
];
}
return $str;
};
return $p;
};
$s = $f($data)(60);
foreach ($s as $item){
echo $item['name'].':'.$item['result'].'<br>';
}
3.函数的返回值
示例:
<?php
// 函数是必须有返回值的,默认返回值为null 示例如下:
function demo(){}
var_dump(demo());
echo '<hr>';
// 函数只能返回单一的值,返回多值有以下几种方式
// 1.通过字符串拼接
function demo1():string
{
$str1 = 'hello';
$str2 = 'php';
return $str1 . $str2;
}
echo demo1().'<hr>';
// 2.通过数组的方式
function demo2():array
{
$name = '张三';
$age = 22;
return ['name' => $name,'age' =>$age ];
}
var_dump(demo2()['name']);
echo '<br>',(demo2()['age']),'<hr>';
// 3.通过json对象字面量字符串的方式
function demo3():string
{
$str1 = 'hello';
$str2 = 'world';
return json_encode(['str1' => $str1,'str2' => $str2]);
}
//输出json格式数据
echo demo3(),'<br>';
// 将json数据解码
print_r(json_decode(demo3()));
echo '<hr>';
// 4.序列化的方式
function demo4():string
{
$name = '张三';
$age = 22;
return serialize(['name' => $name,'age' =>$age ]);
}
//序列化后的数据
echo demo4(),'<br>';
// 反序列化: 还原
print_r(unserialize(demo4()));
4.函数中的参数
//1.值参数
$num = 999;
function demo($num): float
{
return $num;
}
//2.引用传参
$num1 = 666;
//在参数前添加取地址符&
function demo1(&$num1): float
{
// 函数内部对参数的更新会实时映射到外部实际参数
return $num1 *= 2;
}
echo $num1, '<br>';//666
echo demo1($num1), '<hr>';//1332
// 3. 默认参数
// 没有传参时默认的参数的值
// 有默认值的参数,必须写到没有默认值参数的后面
function demo2($num3, $num4, $n = 3)
{
return $num3 * $num4 * $n;
}
// 没有传参数$n, 此时会使用$n的默认值3
echo demo2(1, 10) . "<br>";//输出:30
echo demo2(1, 10, 0.5) . "<hr>";//输出:5
//4.剩余参数
//参数不固定的情况下使用 ...参数名来表示,将所有参数整合到数组中.
//剩余参数用在函数的参数列表中:收集
//剩余参数用在函数的调用表达式中,是展开
function demo3(...$args)
{
//求传入参数的和
return array_sum($args);
}
echo demo3(1, 2, 3) . "<br>";//输出6
// 调用参数的数量不固定的情况
$arr = [1, 2, 3];
$res = demo3(...$arr);
print_r($res);
//5.回调函数
//定义一个数组
$data = range(1,100);
//将数组中的每个值传到匿名函数中处理后返回处理以后的新数组
$arr = array_map(function ($item) {
if ($item % 2 === 0) return $item;
}, $data);
// 过滤掉空值
$res=array_filter($arr);
// 数组重排 array_values()
var_dump(array_values($res));
5.函数的命名空间
namespace s1{
function demo1(){
return "这是space1";
}
}
namespace s2{
function demo1(){
return "这是space2";
}
}
namespace {
echo s1\demo1();
}
总结:初步掌握了函数的基本用法和参数传递,对回调函数的运行机制还是很模糊;