函数作用域与闭包
<?php
//作用域与闭包
$name='小马';
$age='18';
function demo1():string
{
$res='';
//函数内部访问不了外部成员
//一下两种方法解决
global $name;
$res.='我的名字:'.$name.'<br>';
$res.='我的年龄:'.$GLOBALS['age'].'岁<br>';
//外部不能访问内部私有变量
$email='8788@qq.com';
//通过return访问
$res.='我的邮箱:'.$email.'<br>';
return $res;
}
echo demo1(),'<hr>';
//2.闭包也叫匿名函数
$demo2=function()use($name,$age){
return sprintf('我的名字叫:%s<br>我的年龄是:%s岁<br>',$name,$age);
};
echo $demo2(),'<hr>';
//引用传参
$demo3=function($myname) use (&$name){
$name=$myname;
};
$demo3('小明');
echo '当前我叫'.$name.'<br>';
//应用场景
function demo4($site)
{
return function($name)use($site){
return sprintf('%s:%s',$site,$name);
};
}
echo demo4('我现在叫')('小红');
回调的使用场景与参数调用;
<?php
function demo1(string $name):string
{
return "hello $name !"
}
echo demo1('小马'),'<hr>';
//异步调用
//传入单个参数
echo call_user_func('demo1','小明'),'<hr>';
//传入多个参数数组
echo call_user_func_array('demo1',['小红'])
//调用对象方法
class Arr
{
public function im(string $name):string
{
return "我叫 $name ";
}
public static function age(string $site):string
{
return "我今年 $site 岁";
}
}
$res=call_user_func_array([new Arr,'im'],['小马']);
echo $res,'<br>';
$res=call_user_func_array('Arr::age',['18']);
echo $res,'<hr>';
函数的多值返回类型方式
<?php
//1.数组
function demo1(): array
{
return ['age'=>17,'inform'=>'你已年满18'];
}
$res=demo1();
echo $res['age']>=18?$res['inform']:'你没满18';
echo '<hr>';
//2.对象
function demo2(): object
{
return new class(){
public $name='小马';
public $email='2999@qq.com';
};
}
$user=demo2();
printf('我叫%s,我的邮箱是%s',$user->name,$user->email);
echo '<hr>';
//3.序列化字符串
//3.1只在PHP中用
function demo3():string
{
return serialize(['sratus'=>1,'message'=>'验证成功']);
}
$set=demo3();
echo $set,'<hr>';
//还原
$arr=unserialize($set);
var_dump($arr);
echo '<hr>';
//3.2转为json通用型
function demo4():string
{
return json_encode(['sratus'=>1,'message'=>'验证成功'],JSON_UNESCAPED_UNICODE);
}
$str=demo4();
//还原成对象
$res=json_decode($str);
var_dump($res);
//还原成数组
$res=json_decode($str,true);
var_dump($res);