批改状态:合格
老师批语:
匿名函数/闭包/引用/超全局函数示例
全局变量在无传值的情况下,不能直接使用,除非下列几种情况
其中在匿名函数无传值情况下,我使用了use函数来引用了外部的变量
以及使用超全局函数来引入外部的变量,超全局函数如下:$GLOBALS$_GET$_POST
并且重新演示了 & 引入变量,更改引入变量的原始值
代码示例:
<?php/*** 函数属于全局成员* 特殊形式的函数* 1.匿名函数(闭包函数)* 2.回调函数* 3.递增函数*/// 匿名函数输出要放到函数的后面// 强制home参数为字符串function home(string $name = '刘亦菲'): string{// var_dump($name);return "{$name},欢迎您来下榻喜来登酒店";}echo home('周润发');echo '<hr>';//匿名函数:通常会被当做回调函数的参数来使用$namehome = function ($name = '周润发') {return "{$name},欢迎下榻喜来登发财酒店";};echo $namehome();echo '<hr>';echo $namehome('刘亦菲');//闭包引来【变量】的作用于问题,输出【变量】只能放到函数的下面//全局变量是指声明在函数外部的变量,在函数的内部访问不到,需要传值,或use引用一下,或者使用超全局函数//局部变量是指声明在函数内部的变量,只能在函数内部被访问到。函数外部不可访问$name = '隔壁老王';$email = '123456789@qq.com';function loginemail(){$modify = '美丽的'; //局部变量// 当无参数时,使用全局变量时,需要用use引入传值,或者使用超全局函数,这里演示超全局函数// 1. global// 2. 超全局数组$GLOBALS $_GET $_POST// global $name, $email;// 使用超全局函数时,参数的值就是外部的变量return "尊敬的{$GLOBALS['name']}会员,欢迎{$modify}您注册我方邮箱,您的{$GLOBALS['email']}已注册成功,请立即登录";}echo '<br>';echo loginemail();echo '<hr>';//3.闭包函数借助关键字use来引入到函数中// 匿名闭包函数 用use引入传值$loginname = function ($modify) use ($name, $email) {return "尊敬的{$name}会员,欢迎{$modify}您注册我方邮箱,您的{$email}已注册成功,请立即登录";};echo $loginname('美丽的');//闭包改变变量上下文的值 需要引用传值$loginname = function ($newName) use (&$name) {$name = $newName;return $name;};echo '<hr>';echo $loginname('隔壁神仙'); //我在函数中ruturn回来了名字,看下返回的名字,是隔壁神仙,我又在下面输出了全局的name变量 ,有没有发现改变了原始值?//这是因为我使用&引用传值操作echo '<hr>';echo $name;
示例截图:
下面也是函数的示例
下面的函数的实例中,使用了命名空间函数,以及使用了查找作用于内有无当前的函数的函数
命名空间使用namespace来使用
查找当前作用于中是否有其他的函数时使用function_exists("函数名") 来查找
以及使用了查看本地时区的方法 使用date_default_timezone_get(),其中更改为set,查看为get
以及时间函数date()
代码如下:
<?php/*** 函数是全局成员,不受作用域限制* php函数的作用:完成特定功能的代码块,封装成函数,可以实现复用性,提高代码的可维护性* php内置了上千种函数可供我们直接调佣,函数库文件已经编译到我们所使用的发行版中了,可以直接指定函数名称来调佣,当然我们也可以自定义函数来完成特定的功能* 函数的命名规则基本和变量的命名规则一直,可以以字母或下划线开头,后跟字母数字或下划线,但不能以数字开头,函数不区分大小写* 函数的有三大要素,参数,返回值,函数体** php函数语法* function 函数名称 ([参数类型限定 参数列表]):返回值* {* 函数体* return 返回值* 1.函数只能返回单一的值,返回的值的数据类型可以是任意类型* 2.函数碰到return语句,立即结束程序的执行* return 后面的代码不会被执行** }**/namespace qk1 {echo date_default_timezone_get(); //z获取的是默认时区地址,比如美国洛杉矶,中国上海//get是获取, set是修改 中国默认的参数值为PRCecho date('Y-m-d H:m:s');// 定义一个函数//规定返回的类型为string类型function home(string $name): string{return "{$name},欢迎回家,进门请换鞋";}echo home('战神');/*** 参数:可选的,对外提供一个接口,供函数调用者按照自己的意愿改变函数体内的执行行为* 参数分为形参 跟 实参* 默认参数:有默认值的参数,如果不传惨,或者少传参数,就会默认参数的值* 参数是从左往右求值的,所以默认参数放到最右边*/function homedaypay($days, $homepay, $discount = 0.98){$total = $days * $homepay * $discount;return $total;}echo '<hr>';echo homedaypay(5, 200);echo '<hr>';echo homedaypay(5, 200, 0.5);// function_exists()给已定义的函数返回true 没有定义的返回falseecho '<hr>';var_dump(function_exists('homedaypay'));if (!function_exists('homedaypay')) {echo '没有函数'; //打印的时候没有打印出来,因为当前是有这个函数的}}// 同一个脚本下虽然不能存在同名函数,但是可以使用命名空间来做//namespace 命名空间,当声明命名空间的时候,命名空间外不允许有其他代码,必须是多个命名空间namespace qk2 {function homedaypay($days, $homepay, $discount = 0.98){$total = $days * $homepay * $discount;return $total;}// 定义一个全局变量$days = 5;$homepay = 180;$discount = 0.8;// 当前不会改变全局的价格 除非导入到参数中,使用&导入echo homedaypay($days, $homepay, $discount);echo '<hr>';echo $homepay;}namespace qk3 {$days = 5;$homepay = 180;$discount = 0.8;function homedaypay($days, &$homepay, $discount = 0.98){//相当于 当前的折扣0.8* 参数homepay的180 再赋值给homepay$homepay *= $discount;$total = $homepay * $days;return "尊敬的会员,您需要支付{$total}元";}echo '<hr>';// 在函数的参数中引用时,全局值将会改变,例如我运行完函数homedaypay时,最下面的homepay值将改变,如果不运行这个函数,就将不改变echo homedaypay($days, $homepay, $discount);echo '<hr>';echo $homepay;}
示例截图:
函数的返回值及数组=>json 及 json=>数组转换json_encode(数组)用来把数组转换成jsonjson_decode(json,true)用来把json转换成数组file_get_contents("请求api的url") 请求apifile_pul_contents("文件名路径"请求api的url")//请求别人的url直接将json储存在文件中
拿过代码去不要看不懂,我在里面加了一个ob_clean(); 清除上部的文件执行,可以删掉之后访问试试
下面的数据我已经遍历出来之后,输出到php页面中了
代码示例:
<?php// 函数的返回值function obj(){// return md5('5211314520'); //返回一组加密数据// return new stdClass();// return '1' === 1; //完全=1 false 可以用var_dump打印一下// return '1' == 1;return ['123', 321, '666888']; //用var_dump打印一下 echo直接出不来 可以转换成json用echo出来return 666;}echo json_encode(obj());var_dump(obj());//接口的开发 函数返回值会转为通用的json格式的数据返回,这样一来就可以与其他的编程语言进行数据的交互处理,例如json与php,js,java,python等等// 从juhe.com拿输出进行转换$loginarr = ['status' => 1, 'message' => '登录/成功'];//常用于登录// 记得一定要在函数的参数里面传值进去,直接在函数里面使用,是不行的function login($loginarr){//json_encode将数组转成json//json_encode()第二个参数是一个常量,JSON_UNESCAPED_UNICODE(中文不转为unicode ,对应的数字 256),JSON_UNESCAPED_SLASHES (不转义反斜杠,对应的数字 64)return json_encode($loginarr, 320);}$loginstr = login($loginarr);echo $loginstr;ob_clean();// 接口的开发 将json转成数组// 用file_get_contents请求别人的json数据$res = file_get_contents('http://v.juhe.cn/toutiao/index?type=top&key=key');// 储存文件到路径 使用file_put_contens('路径文件名',$res)//返回的是json数据// echo $res;// 对json数据进行数组化$resarr = json_decode($res, true);// var_dump($resarr);$arr = $resarr['result']['data'];foreach ($arr as $key => $value) {echo "<div>标题:{$value['title']}</div><div>时间:{$value['date']}</div><div>网址:{$value['url']}</div><div>来源:{$value['author_name']}</div><br>";}
示例截图:
匿名函数的回调,传值
匿名函数的闭包回调传值,其实看完下面的意思 特别明确,就是封装一个函数,封装好后,在需要的时候,直接拿过来用,比如下面的$odd声明的这个匿名函数,我需要的时候,在任何地方都可以使用他,这个函数就是一个筛选数组的偶数出来,重新装成数组,我想用的时候,直接调用即可,在$sumarr这个声明的函数里面,我声明了第一个参数为闭包函数,使用Closure声明,(偷偷告诉同学们,不声明也执行),声明第一个参数时一个函数,第二个参数时一个数组,我在后面传值的时候,直接$sumarr(函数,值)进去,ok了,还有匿名函数可以用call_user_func回调,命名函数可以用call_user_func_array来回调,注意,call_user_func_array第二个参数是一个数组,当然 他们第一个参数 都是一个函数,使用call_user_func_array时,第二个参数要以[]数组的方式存在.
代码部分:
<?php/*** 回调函数:php回调函数是指在主线程函数执行的过程中,突然跳去执行设置的回调函数,回调函数结束执行结束后,再回来执行主线程函数** 匿名函数最通常作为回调函数的参数使用*///给到一个任意的数组,把数组中的偶数筛选出来,组成一个新的数组,返回,然后计算新数组的所有偶数的和$arr = [12, 24, 56, 108, 351, 246, 285, 344, 1065];$odd = function (array $arr) {// for循环遍历输出的长度,默认长度为0for ($i = 0; $i < count($arr); $i++) {// 如果数组内的值 也就是$i 能被2整除 则把$arr[$i]塞到$newarr[]数组里面if ($arr[$i] % 2 == 0) {$newarr[] = $arr[$i];};};return $newarr;};// 打印一下传入的值筛选出来之后的, 转成了json格式echo json_encode($odd($arr));//计算数组所有偶数的和// Closure声明第一个参数为闭包函数// 这个closure可以省略,在这里写这感觉怪怪的// $funt是函数, $arr是数组$sumarr = function (Closure $funt, $arr) {// 这里理解为调用$funt这个函数,传入$arr这个数组,计算之后的新数组赋值给$arrnew$arrnew = $funt($arr);// 然后用数组求和函数 array_sum求和返回return array_sum($arrnew);};echo newa(6, 5);echo "<hr>";echo $sumarr($odd, $arr);echo "<hr>";//声明一个命名函数后面用function newa($a, $b){$c = $a + $b;return $c;};// 适用于匿名函数var_dump(call_user_func($odd, $arr));echo "<hr>";// call_user_func_array适用于命名函数var_dump(call_user_func_array('newa', ['6', '7']));
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号