PHP:函数的返回值和参数,实例回调函数,匿名函数的理解
一.PHP函数
/**
* 函数:完成特定功能的代码块~
函数:属于全局成员 全局可访问
*
* function 函数名称([ 参数类型限定 参数列表]) :返回值类型限定
* {
* #函数体
* return 返回值;
* 1. 函数只能返回单个值,返回值的数据类型可以是任意类型
* 2. 函数碰到return语句,立即结束程序执行,return后面的代码不会被执行
*}
*/
①自定义函数
//自定义函数
function setSum(float $a , int $b) :int
{
return $a + $b;
}
echo setSum(10,20);
②return返回值
大家可以看到函数体内有多个return 返回了多个数据,但是return返回值只能返回一个值,而且在函数体内只要输出了return函数脚本则不会继续执行下去,系统也是按照从上到下解析的,所以最后的出的结果是100/200=5
//return返回值
function setSum(float $a , int $b) :int
{
return $a / $b;
return $a * $b;
return $a + $b;
}
echo setSum(100,20).'<hr>';
③return数组多个值
在函数里面return 数组也是没有问题的,可以返回多个值,如果要获取数组里面的内容则要用数组key也就是键值去获取,如果不知道这是什么东西可以用print_r来打印数组
//数组返回
function setArr():array
{
return ['张帅',"echo666",'857857'];
}
$arr = setArr();
print_r($arr);
④return对象多个值
在访问对象里面的nam值的时候可以用->来进行访问
//对象返回
function setOBJ() :object
{
return new class(){
public $name = 'admin';
public $email = '1234@qq.com';
};
}
// $obj = setOBJ();
// echo $obj->name;
var_dump(setOBJ());
echo '<hr>';
⑤return 返回json类型
中文不转为unicode-> json_encode JSON_UNESCAPED_UNICODE 256
图片不转为unicode->JSON_UNESCAPED_SLASHES 64 图片转义和文字转义相加等于320
json_decode 能将json格式还原成php能够处理的数据类型
传入第二个参数true 可以转为原始数组
//转为json格式字符串返回
function setJson() :string
{
//json_encode JSON_UNESCAPED_UNICODE 256 中文不转为unicode
//JSON_UNESCAPED_SLASHES 64 图片转义和文字转义相加等于320
return json_encode(['id'=>1 ,'mag'=> '验证成功'],320);
}
$json_arr = setJson();
echo $json_arr .'<hr>';
//json_decode 能将json格式还原成php能够处理的数据类型
//传入第二个参数true 可以转为原始数组
$res = json_decode($json_arr,true);
var_dump($res);
⑤return 序列化字符返回
serialize 序列化字符返回 ,如果要解析里面的内容则要转换为php能解析的数字类型,用unserialize转换
unserialize 转换为数组类型
//序列化字符返回
function setLize(){
//serialize 序列化字符
return serialize(['id' => 1 ,'name' => 'admin@qq.com' ,'password' => '132456']);
}
var_dump(setLize());
echo '<hr>';
//unserialize转换成php能解析的类型
print_r(unserialize(setLize()));
二.PHP函数参数的引用
函数参数的作用:
- 1.没有参数时, 执行的任务是固定的
2.有参数,可以根据用户传递过来的数据决定函数内的程序该如何执行,函数的参数列表是给用户调用函数的时候,提供的接口
①自定义函数生成表格,参数是固定的不方便用户传递属性
//自定义表格属性
function taBle(){
$table = '<table border = "1" cellspacing = "0" >';
//for循环 循环表格列和行
for ($i=0; $i < 3; $i++) {
//外层循环控制表格的行
$table .="<tr>";
for ($j=0; $j < 3 ; $j++) {
//内层循环控制表格的列
$table .="<td><input type='button' value='按钮' /></td>";
}
//外层循环控制表格的行
$table .="</tr>";
}
echo $table;
}
②让函数内部的参数不固定,让用户传递参数遍历表格
在函数里面声明遍历行参,写好函数内部代码后,让用户填写函数的实参就能形成用户想要的表格样式
//让函数内部的参数不固定,让用户传递参数遍历表格
//函数行参有,$row 行 , $cols 列 ,$background 背景色,$content 文字内容
function taBle2(int $row , int $cols ,string $background = 'blue' ,string $content = "心"){
$table = "<table border = '1' cellspacing = '0' bgColor='$background' >";
for ($i=0; $i < $row ; $i++) {
//外层循环表格的行
$table .="<tr>";
//内层循环表格的列
for ($j=0; $j < $cols ; $j++) {
$table .="<td>$content</td>";
}
$table .="</tr>";
}
$table.="</table>";
return $table;
}
echo taBle2(5,3,"lightblue","张帅");
三.PHP匿名函数
- 函数:属于全局成员 全局可访问
- 匿名函数 Anonymous functions 闭包 closures
- 允许 临时创建一个没有指定名称的函数
此时变量名称就是这个匿名函数,我们就可以给它传递参数
在php中匿名函数,就是闭包,闭包会引发php作用域问题,php局部作用域访问全局作用域中的变量用:
global
和 超全局数组$GLOBALS
,闭包可以通过use
访问函数外部的自由变量/父作用域中的变量
闭包可以改变上下文中的值,但是需要用的引用传递&
在工作中闭包常用作函数的返回值,返回一个闭包匿名函数,访问外部匿名函数行参$content,第一次传参是给父节点函数,第二次传参是给子节点匿名函数
当然也可以一起传参:echo demo3(“php中文网”)(“red”);
代码块
<?php
/**
* 函数:属于全局成员 全局可访问
* 匿名函数 Anonymous functions 闭包 closures
* 允许 临时创建一个没有指定名称的函数
*/
//匿名函数,没有函数名称的函数
$setName = function ($name){
echo $name;
};
//此时变量名称就是这个匿名函数,可以给他传递参数
$setName("张帅");
echo "<hr>";
//在php中匿名函数,就是闭包,闭包会引发php作用域问题
//php局部作用域访问全局作用域中的变量用:global 和 超全局数组$GLOBALS
$name = "张起灵";
$email = "13456@qq.com";
//闭包可以通过use访问函数外部的自由变量/父作用域中的变量
$demo = function() use ($name,$email){
return sprintf('name = %s <br> email = %s <br>',$name , $email);
};
echo $demo() . "<hr>";
//闭包可以改变上下文中的值,但是需要用的引用传递&
$name1 = "我是自由/全局变量";
echo $name1 ."<br>";
$demo2 = function ($content) use (&$name1){
return $name1 = $content;
} ;
$demo2("我可以改变自由/全局变量");
echo $name1 ."<hr>";
//在工作中闭包常用作函数的返回值
function demo3 ($content){
//返回一个闭包匿名函数,访问外部匿名函数行参$content
return function ($color) use ($content){
return sprintf("<h3 style='color:%s'>%s</h3>",$color,$content);
};
};
//第一次传参是给,父亲节点函数
$demo4 = demo3('php中文网');
//第二次传参是给,子节点匿名函数
echo $demo4('green');
//一起传参
echo demo3("php中文网")("red");