Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
1.完成特定功能的代码块;
2.分为命名函数(全局成员不受作用域限制)和匿名函数
function 函数名称([参数列表-形参])
{
函数体
return 返回值
}
//不受作用域限制可以在函数上面调用也可以在函数下面调用
demo(22,2) // 11
function demo()
{
retuen $one / $two;
}
demo(22,2) // 11
1.return只能返回单个值;如果想返回多个值,可以返回一个数组或对象;
2.return后面的代码不会被执行;
function demo($one, $two)
{
retuen $one / $two;
echo '你好';
}
demo(22,2) //11;
没有执行echo输出'你好';
function demo($one, $two)
{
return sha1('www.php.cn');
//string(40) "9210325b59990016a4d9bf6709670b7dc8ab4d02"
return md5('www.php.cn');
//string(32) "372dba858dc62fee52a552a044caa82e"
return 1 == 1;
//bool(true)
return new StdClass();
//object(stdClass)#1 (0) { }
return array('11','22');
//array(2) { [0]=> string(2) "11" [1]=> string(2) "22" }
return 22.22;
//float(22.22)
return '你好';
//string(6) "你好"
return true;
//bool(true)
}
var_dump(demo());
//数组
function demo()
{
return ['name' => 'ccc', 'gender' => 'ddd'];
}
$obj = demo();
var_dump($obj);//array(2) { ["name"]=> string(3) "ccc" ["gender"]=> string(3) "ddd" }
echo $obj['name']; //ccc
echo $obj['gender']; //ddd
//对象
function demo()
{
return new class()
{
public $name = 'ccc';
public $gender = 'ddd';
};
}
$obj = demo();
var_dump($obj); //object(class@anonymous)#1 (2) { ["name"]=> string(3) "ccc" ["gender"]=> string(3) "ddd" }
echo $obj -> name; //ccc
echo $obj -> gender; //ddd
//json字符串
function demo()
{
//json_encode(参数)将数组转为json字符串
return json_encode(['status' => 1, 'msg' => '验证成功']);
}
$obj = demo();
var_dump($obj); //string(45) "{"status":1,"msg":"\u9a8c\u8bc1\u6210\u529f"}"
/**
* json_encode(参数,320)将数组转为json字符串,第二个参数320,中文不转为unicode同时不转义反斜杠;
* JSON_UNESCAPED_UNICODE对应数字256 => 中文不转为unicode;
* JSON_UNESCAPED_SLASHES对应数字64 => 不转义反斜杠;
* son_encode(['status' => 1, 'msg' => '验证成功'], 320) => string(33) "{"status":1,"msg":"验证成功"}"
*/
var_dump( json_decode($obj); //object(stdClass)#1 (2) { ["status"]=> int(1) ["msg"]=> string(12) "验证成功" } =>是个对象
/**
* json_decode(参数,boolean);将json字符串转为数组
*false 默认值,转为对象;
*true 转为数组;
*json_decode($obj, true); =>array(2) { ["status"]=> int(1) ["msg"]=> string(12) "验证成功" }
*/
1.可以有多个参数, 以英文逗号 , 隔开;
2.形参可以有默认值;
3.实参会替换掉形参;
4.实参与形参存在从左向右一 一对应, 如果没对应就会报错(实参的第一个值默认对应形参的第一个值);
//形参都没有默认值
function demo($one, $two)
{
return $one + $two;
}
echo demo() //报错
echo demo(1,2) //3
//形参都有默认值,实参会替换掉形参
function demo1($one = 1, $two = 2)
{
return $one + $two;
}
echo demo1() //3
echo demo1(3, 4) //7
//第二个形参有默认值,实参替换第一个形参,第二个形参使用默认值
function demo2($one, $two = 2)
{
return $one + $two;
}
echo demo2(1) //3
//第一个形参有默认值,实参替换第一个形参,第二个形参没有默认值
function demo3($one = 1, $two)
{
return $one + $two;
}
echo demo3(2) //报错
适用于参数个数不确定的时候
//在形参中表示收集的作用,在实参中表示展开的作用
$arr = [555, 666, 777, 888];
function demo(...$args)
{
var_dump($args);
}
demo(111, 222, 333, 444)
//array(4) { [0]=> int(111) [1]=> int(222) [2]=> int(333) [3]=> int(444) }
demo(...$arr)
//array(4) { [0]=> int(555) [1]=> int(666) [2]=> int(777) [3]=> int(888) }
1.匿名函数又叫闭包closure, 指允许临时创建的一个没有名字的函数
2.匿名函数通常需要赋给一个变量,所以匿名函数的作用域问题通常指闭包中变量的作用域问题
3.匿名函数需要在{}花括号后面加;分号
4.闭包通常作为函数的返回值使用;
5.通过引用传值的方式可以改变全局变量上下文的值
//受作用域限制不可以在函数上面调用,只可以在函数下面调用
//echo $demo(1,2); //报错
$demo = function($one, $two)
{
return $one + $two;
};
echo $demo(1,2); //3
//作为函数的返回值
function getInfo($name)
{
return function($gender) use ($name)
{
return "名字叫{$name}, 性别是{$gender}";
};
}
echo getInfo('ccc'); //报错 因为返回的不是字符串而是闭包函数
//解决办法1:直接将第二个参数传进去
echo $getInfo('ccc')('ddd'); ////名字叫ccc, 性别是ddd
//解决办法2:先赋给一个变量再传第二个参数
$closure = getInfo('ccc');
echo $closure('ddd'); //名字叫ccc, 性别是ddd
//改变全局变量的值
$name = 'ccc';
$demo = function($newName) use ($name)
{
$name = $newName;
};
$demo('eee');
echo $name; //ccc 没有改变
//引用赋值&
$demo = function($newName) use (&$name)
{
$name = $newName;
};
$demo('eee');
echo $name; //eee 有改变
函数体外声明的变量
全局变量在函数体内是无法访问的;命名函数解决办法是用关键字global或超全局变量$GLOBALS;匿名函数解决办法是用use();
//命名函数
$name = 'ccc';
$gender = 'ddd';
function getInfo()
{
return "名字叫{$name},性别是{$gender}";
}
echo getInfo(); //报错
//使用关键字global
function getInfo_pro1()
{
global $name, $gender;
return "名字叫{$name},性别是{$gender}";
}
echo getInfo_pro1(); //名字叫ccc,性别是ddd
//使用超全局变量$GLOBALS
function getInfo_pro2()
{
return "名字叫{$GLOBALS['name']},性别是{$GLOBALS['gender']}";
}
echo getInfo_pro2(); //名字叫ccc,性别是ddd
//匿名函数
$name = 'ccc';
$gender = 'ddd';
$getInfo = function()
{
return "名字叫{$name},性别是{$gender}";
};
echo $getInfo(); //报错
$getInfo = function() use ($name, $gender)
{
return "名字叫{$name},性别是{$gender}";
};
echo $getInfo(); //名字叫ccc,性别是ddd
在函数体内声明的变量
局部变量在函数体外无法访问
function getInfo()
{
$name = 'ccc';
$gender = 'ddd';
return "名字叫{$name},性别是{$gender}";
}
echo getInfo(); //名字叫ccc,性别是ddd
echo $name //报错