Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:
实例演示函数作用域与闭包,回调的使用场景与参数调用; 2. 实例演示函数的多值返回类型方式,重点是json
function 名称(类型限定 参数):返回类型{
//函数体
//return 返回值,没有return 返回null
}
2.分类
function demo1(){
return 'hello';
}
echo demo1();
$demo2=function(){
return 'php.cn';
}
echo demo2();
function demo3(string $name): string
{
return "hello $name !";
}
//将标量(单值)会自动转为字符串
echo demo3(123);
echo demo3(true);
function demo4(string $name='hello world'): string
{
return "hello $name !";
};
echo demo4();
//当有多个参数时,可选参数必须放在后面
// 因为调用的时候如果不传参默认输出的话,得想办法空出来可选参数
3.不定参数
function demo5(){
//参数有几个
$n=func_num_args();
//参数组成的数组
func_get_args();
//获取某一个参数
$arg=func_get_args()[1];
//参数求和
array_sum(func_get_args());
//不推荐使用以上三个函数了,有更简便的替代...rest
}
demo5(1,2,3);
简化为:
function demo6(...$args){
//参数有几个
$n=count($args);
//参数组成的数组
$args;
//获取某个参数
$arg=$args[1];
}
4.引用参数
在函数内部对参数的任何更新都会实现映射到外部的参数中
$name='小红';
function demo7(string &$name){
$name='小明';
}
echo "\$name=$name"; //小红
echo demo7($name);
echo "\$name=$name"; //小明
只允许有一个返回值,返回多值,只能在返回值的类型上动手脚
1.数组
function demo8():array
{
return ['ab'=>1,'cd'=>2];
};
2.对象
function demo9():object
{
//匿名类
return new class(){
public $name='admin';
public $email='admin@php.cn';
};
}
3.序列化字符串
如果有一些数据需要进行网络传输或保存到文件或数据表中的时候要用到它,如果这个序列化的数据只在php程序中使用,应该使用php内置的方法
function demo():string
{
return serialize(['ab'=>1,'cd'=>2]);
};
//返回序列化的字符串
$str=demo();
//在php中使用时要还原成原来的类型
$arr=unserialize($str);
4.转为通用的json格式的字符串
function demoo():string
{
//JSON_UNESCAPED_UNICODE 处理中文
return json_encode(['ab'=>1,'cd'=>'小红'],JSON_UNESCAPED_UNICODE);
};
echo $str=demoo();
//当前脚本接收到一个前端或其他接口发送过来的json格式的数据,可以进行解析
$res=json_decode($str);//将外部json解析成对象类型
$res=json_decode($str,true);//将外部json解析成数组类型
$name="小王";
$email='1747615798@qq.com';
function demo1():string
{
$res='';
//如果想在函数内部访问全局/外部的成员
//两种方式可以在函数内部访问外部成员
// 1.global
global $name;
$res.='name='.$name;
//2.$GLOBALS
$res.='email='.$GLOBALS['email'];
return $res;
}
echo demo1();
闭包:匿名函数,可以访问函数外部的自由变量/父作用域中的变量
$name="小王";
$demo2=function()use($name)
{
return $name;
};
echo $demo2();
闭包支持引用传参,参数前加 &
$demo3=function($myname) use(&$name)
{
return $name=$myname;
};
$demo3('小蓝');
注意:use禁止使用一下三种参数
1.超全局不让用
2.$this
3.与当前参数重名不让用
php单线程,同步执行,如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行
也可用对象上
function demo4(string $name) :string
{
return $name;
}
echo call_user_func('demo4','小明');
class User{
public function hello($name):string
{
return $name;
}
public static function say(string $site):string
{
return $site;
}
}
//普通方法
$res=call_user_func_array([new User,'hello'],['小红']);
echo $res;
//静态方法
$site=call_user_func_array(['User','say'],['小李']);
//也可简写
$site=call_user_func_array('User::say',['小李']);
echo $site;
function demo(){
//函数中的静态变量不会随函数调用结束而消失
//它会自动进入到下一次的函数调用中
//可以实现函数的多次调用过程中:共享数据/数据通信
static $i=1;
echo $i;
$i++;
}
echo demo();
echo demo();
echo demo();