匿名函数/闭包/引用/超全局函数示例全局变量在无传值的情况下,不能直接使用,除非下列几种情况其中在匿名函数无传值情况下,我使用了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是修改 中国默认的参数值为PRC
echo 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 没有定义的返回false
echo '<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循环遍历输出的长度,默认长度为0
for ($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']));
相关推荐
© 2020 asciim码
人生就是一场修行