批改状态:合格
老师批语:
1.完成特定功能的代码块;
2.分为命名函数(全局成员不受作用域限制)和匿名函数
function 函数名称([参数列表-形参])
{
函数体
return 返回值
}
//不受作用域限制可以在函数上面调用也可以在函数下面调用demo(22,2) // 11function 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']; //cccecho $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; //cccecho $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() //3echo 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(); //报错//使用关键字globalfunction getInfo_pro1(){global $name, $gender;return "名字叫{$name},性别是{$gender}";}echo getInfo_pro1(); //名字叫ccc,性别是ddd//使用超全局变量$GLOBALSfunction 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,性别是dddecho $name //报错
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号