1.函数作用域与闭包,回调的使用场景与参数调用
1.1函数作用域
<?php
//声明在函数之外的成员,默认是全局成员
$name ='张三';
$age = 10;
function stus(){
//只有调用时,才会创建函数作用域
//访问外部成员方法1 global
//访问外部成员方法2 $GLOBALS['name']
//私有变量访问可以通过返回的方式
$cla ='三年级';
global $name;
return $name.$GLOBALS['age'].$cla;
}
echo stus();
1.2闭包
没有名字的函数叫做匿名函数,匿名函数叫做闭包
<?php
//闭包:可以访问函数外部的自有变量
//用关键字 use
//匿名函数需要访问外部变量时用use关键字即可,支持引用传参
$name = '张三';
$age = 24;
$stu = function () use ($name, &$age) {
$age = 42;
return $name . '的年龄是' . $age . '岁';
};
echo $stu();
echo $age;
//use禁止使用的三种参数
//1.超全局$GLOBAL 2.$this 3.和当前参数同名不让用
1.3回调函数与使用场景
<?php
//php单线程,同步执行
//回调函数call_user_fanc(),将耗时的函数变成异步执行,以免同步阻塞
//使用场景:数据库链接
function stu($name){
return $name;
}
echo stu('李四');
echo call_user_func('stu','张三');
echo call_user_func_array('stu',['张三']);
1.4静态变量
<?php
//静态变量:不会随着函数作用域的消失而消失,会进入下一次的函数调用中
//作用:函数多次调用中共享数据,场景:CMS系统栏目的无限分类
function stu(){
static $i = 1;
echo $i;
$i++;
}
echo stu();
echo stu();
echo stu();
2.函数的多值返回类型方式
函数只允许一个返回值,如果想返回多值有三种方法1.数组2.对象3.序列化字符串
2.1数组
<?php
function stumess()
{
return ['name' => '张三', 'age' => '25', 'cla' => '大学'];
}
echo stumess()['name'] === '张三' ? stumess()['age'] : 1;
2.2对象
<?php
function stumess()
{
return new class ()
{
public $name = '张三';
public $age = 28;
};
}
$stu = stumess();
var_dump($stu);
printf('name = %s,age = %d',$stu->name,$stu->age);
2.3序列化字符串
2.31 php内置的序列化函数serialize()
<?php
function stumess()
{
return serialize(['name' => '张三', 'age' => '25', 'cla' => '大学']);
}
//可将结果保存到文档里
file_put_contents('wenzi.txt',stumess());
//使用时还原
var_dump(unserialize(stumess()));
2.32转换为通用的JSON序列化字符串函数json_encode()
<?php
function stumess()
{
return json_encode(['name' => '张三', 'age' => '25', 'cla' => '大学'],JSON_UNESCAPED_UNICODE);
}
//第二个参数可以将中文字符还原出来,JSON_UNESCAPED_UNICODE,如果不加会显示对应utf-8编码字符
echo stumess();
//还原JSON字符串函数 json_decode()
$str = json_decode(stumess());
var_dump($str);
//json_decode() 默认解析为对象,如果需要解析成数组,需要加第二个参数ture
$str = json_decode(stumess(),true);
var_dump($str);