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函数参数的引用
函数参数的作用:
//自定义表格属性 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匿名函数
此时变量名称就是这个匿名函数,我们就可以给它传递参数
在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");