1.函数的分类:
1.1:命名函数:会自动提升到php脚本的顶部,可以在全局的任何地方调用,例如:
echo add_num(1,2);//结果是3,证明命名函数可以在全局任何地方使用
function add_num(int $a, int $b):int
{
return $a+$b;
};
1.2:匿名函数:也叫闭包函数(closures),临时创建一个没有指定名称的函数,闭包函数可以赋值给一个变量来使用,闭包可以访问函数外部的自由变量,即父作用域中的变量,方法是在函数的()和{}之间用use(),并填上要使用的外部变量,例如:
$name = "Jasper";
$age = "18";
$about_me = function () use($name, $age){
return sprintf('My name is %s, i am %s years old.',$name,$age);
};
echo $about_me();//运行结果是:My name is Jasper, i am 18 years old.
闭包经常用作函数的返回值,例如:
function closures_demo($userName){
//返回一个闭包函数
return function ($color) use($userName){
return sprintf('<div style="color: %s"; >%s</div>',$color,$userName);
};
};
此类函数的调用方式可以和js里的柯里化相似:
echo closures_demo("Jasper")("blue");
运行结果如图:
3.函数变量的一些特点:
3.1:函数内部声明的变量叫私有变量,外部不可见,通过return才能在外面访问
3.2:在函数内部访问全局/外部的成员方法有二:
a:使用global
b:$GLOBALS,超全局变量数组是不受使用域限制的,所有的变量都可以以键名的方式在$GLOBALS数组中访问,例如:
$user_name = "Peter";
$user_age = "18";
function get_userinfo(){
global $user_name;
return "username is: $user_name , userage is: ".$GLOBALS["user_age"]."<br>";
};
echo get_userinfo();//运行结果:username is: Peter , userage is: 18
4.函数参数的特点:
4.1:函数的参数分为:
a:必须参数
b:可选参数(给参数设置默认值)
c:不定参数
d:引用参数(在参数前加上&,在函数内部对参数的任何改变都会映射到函数外面的参数中)
四种参数中,不定参数和引用参数挺重要的,必须重点来作个演示以便加强记忆
首先我们演示一下不定参数,在js的学习中我们知道了有function(…rest){}的写法,在php当中同样有,在我们不知道具体应该写多少个参数的时候可以使用此方法:
function add_Numbers(...$Nums){
return array_sum($Nums);
};
echo add_Numbers(1,2,3,4,5,6);//运行结果:21
php中上古时期的方法:
func_num_args():获取输入参数的的个数
func_get_args():获取函数的所有参数
func_get_arg ( int $arg_num ):获取输入参数某个特定位置的值
function add_ns(){
$sum=0;
for ($i=0;$i<func_num_args();$i++){
$sum+=func_get_arg($i);
};
return $sum;
};
echo add_ns(1,2,3);//运行结果:6
引用参数,在要引用的参数前加&,这样在函数里对这个参数重新赋值,被引用的值在函数外也会发生变化,例如:
$my_position = "Sichuan";
function change_position(string &$my_position){
$my_position="Guangdong";
};
echo "my_position = $my_position <br>";//运行结果:my_position = Sichuan
//调用后:
change_position($my_position);
echo "my_position = $my_position";//运行结果:my_position = Guangdong
如图:
5:静态变量:static
当我们把函数中的一个变量声明为静态变量时,我们在调用函数时静态变量不会随函数的调用结束而消失,它会自动进入到下一次函数调用当中,即可以实现在函数的多次调用过程共享数据,例如:
function sta(){
static $a = 1;
echo $a,"<br>";
$a++;
};
echo sta();//1
echo sta();//2
echo sta();//3
6.函数的异步回调执行
因为php是单线程同步执行,如果遇到耗时较多的函数,我们应该将它设置为异步回调执行,方法是:
call_user_func(‘函数名’,”参数列表”);
call_user_func_array(‘函数名’,’参数数组’);
例如:
function greeting(...$names){
$n = count($names);
$say_hi="";
for ($i=0;$i<$n;$i++){
$say_hi .="Hi! ".$names[$i]."<br>";
}
return $say_hi;
};
echo call_user_func_array("greeting",["小张","小王","小李"]);
执行结果如下图所示:
原则上函数的只有一个返回值的,但是如果我们要返回多个值的时候,只能在返回值的类型上下功夫,例如数组/对象,但是当我们要把返回的值传给前端,接受者是JavaScript,我们可以使用json_encode()方法把值转成JSON字符串进行传输,例如:
function get_user_info(){
$u_name = "jasper";
$u_age = "18";
$u_grade="黄金会员";
//第二个参数是为了让它返回中文
return json_encode([$u_name,$u_age,$u_grade],JSON_UNESCAPED_UNICODE) ;
};
var_dump(get_user_info());//string(30) "["jasper","18","黄金会员"]"
在php中解析json字符串我们使用 json_decode()方法:
var_dump(json_decode(get_user_info()));//array(3) { [0]=> string(6) "jasper" [1]=> string(2) "18" [2]=> string(12) "黄金会员" }
如果我们在js中接受来自PHP传输过来的json字符串,我们可以使用:JSON.parse()方法;