批改状态:合格
老师批语:
在PHP程序编译时,函数是不分大小写的,变量区分大小写,这个和其他编程时有所不同;
function 函数名称(限定类型 参数列表) : 返回值类型{// 函数体return 返回值;// 没有return,返回NULL}
函数声明分为命名函数和匿名函数
| 函数声明 | 标识 | 特点 |
|---|---|---|
| 命名函数 | 标识符 | 命名函数自动提升到脚本的顶部,在全局任何地方都可以调用到 |
| 匿名函数 | 变量 | 需要定义变量才能够调用,不能够在函数未定义前调用 |
function site(){echo 'php.cn';}echo site();
$url = function(){return 'www.baidu.cpm';};echo $url();
函数只允许有一个返回值,当我们需要返回多个值的时候,又应该如何解决呢?
//数组function state(): array{return ['status' => '1', 'message' => '验证通过'];}$res = state();//var_dump($res);echo $res['status'] == 1 ? $res['message'] : '验证失败';//打印 验证通过
//对象function getUser(): object{return new class{public $name = 'admin';public $email = '923617189@qq.com';};}$user = getUser();//var_dump($user);printf('name=%s<br>email=%s', $user->name, $user->email);// 打印// name=admin// email=923617189@qq.com
| 函数 | 描述 |
|---|---|
| serialize() | 把字符串转换成序列化 |
| unserialize() | 反序列化,把序列化转换成字符串 |
| json_encode() | 把字符串转换成JSON格式 |
| json_decode() | 反JSON格式,把JSON格式转换成对象(默认对象),也可以转换成数组类型 |
serialize()
//序列化的数据类型就是字符串类型function movies() : string{return serialize(['id'=>1,'movie'=>'豆瓣电影']);}$movie = movies();echo $movie;//把序列化字符串保存到文本中,并且创建文件file_put_contents('file.txt',$movie);
unserialize()
//在php中使用时要还原成原来的类型$arr = unserialize($movie);var_dump($arr);//打印 array(2) { ["id"]=> int(1) ["movie"]=> string(12) "豆瓣电影" }
json_encode()
//3.2 转为通用json格式的字符串//这样就可以与其他编程语言进行数据交换,例如 js、java、pythonfunction success(){//return json_encode(['status'=>1,'message'=>'验证成功'],JSON_UNESCAPED_UNICODE);return json_encode(['status'=>1,'message'=>'验证成功']);}$res = success();var_dump($res);//打印 string(48) "{"status":1,"message":"\u9a8c\u8bc1\u6210\u529f"}"
json_decode()
//如果当前脚本接收到一个前端或其他接口发送过来的json格式的数据,可以进行解析//解析的目的是将外部的json还原成php能够处理的数据类型$res = json_decode(success());var_dump($res);echo '<br>';//打印 object(stdClass)#2 (2) { ["status"]=> int(1) ["messag"]=> string(12) "验证成功" }//默认将外部的json解析成object对象类型printf('status =>%d, message => %s',$res->status,$res->message);//打印 status =>1, message => 验证成功echo '<br>';//如果不喜欢对象的方式访问,也可以使用数组方式//给 json_decode() 第二个参数,传入true$res = json_decode(success(),true);var_dump($res);//打印 array(2) { ["status"]=> int(1) ["message"]=> string(12) "验证成功" }
函数的参数传参有多种形式,可以应用在不同的实战场景
//必选参数function userName($name) : string{return 'Hello ' . $name;}echo userName('Tome');
//可选参数function userName($name = 'Tome') : string{return 'Hello ' . $name;}echo userName();//打印 Hello Tomeecho userName('Jack');//打印 Hello Jack//如果输入参数会覆盖默认参数值
//不定参数function getArgs(...$args){$count = count($args);$array = implode(', ',$args);$arg = $args[1];$sum = array_sum($args);printf('参数数量: %d<br>参数数组: [%s]<br>第2个参数: %d<br>参数总和: %d',$count,$array,$arg,$sum);}getArgs(1,2,3,4);// 参数数量: 4// 参数数组: [1, 2, 3, 4]// 第2个参数: 2// 参数总和: 10//实战:数据表查询function connect(...$args){//print_r($args);return new PDO($args[0], $args[1], $args[2]);}$pdo = connect('mysql:dbname=mysql', 'root', 'root');if ($pdo) {echo '连接成功';} else {echo '连接失败';}
//引用参数//js函数参数只支持值传递//php支持"值传递"和"引用传递"//参数默认就是值传递//引用传参: 在函数内部对参数的任何更新都会映射到外部的参数中$name = 'Tome';function nickName($name){$name = 'Jack';return $name;}nickName($name);echo "\$name = " . $name;//打印 $name = Tome//使用引用传参//应用场景 对象处理function nickName2(&$name){$name = 'Panghu';}nickName2($name);echo "\$name = " . $name;//打印 $name = Panghu
函数作用域,只有调用它的时候才会被创建
$name = 'Tome';function getUser() : string{//函数作用域,只有调用它的时候才会被创建$res = '';//如果想在函数内部访问全局/外部的成员//有二种方式可以在函数内部访问外部成员//1. globalglobal $name;$res .= '$name = ' . $name . '<br>';return $res;}echo getUser();//打印// $name = Tome
超全局数组不受作用域限制
$email = '923617189@qq.com';function getUser() : string{//函数作用域,只有调用它的时候才会被创建$res = '';//$GLOBALS,超全局数组不受作用域限制$res .= '$email = ' . $GLOBALS['email'];return $res;}echo getUser();//打印// $email = 923617189@qq.com
闭包也叫匿名函数
//1. 闭包支持引用传参: 参数前加&echo '当前: $name = ' . $name . '<br>';//当前: $name = Tome$getName = function () use (&$name){$name = 'Jack';};$getName();echo '现在: $name = ' . $name . '<br>';//打印 现在: $name = Jack//2. 引用参数$getName2 = function ($nickname) use(&$name){$name = $nickname;};$getName2('Panghu');echo '现在: $name = ' . $name . '<br>';//打印 现在: $name = Panghu// use禁止使用一下三种参数// 1. 超全局不让用: $_GET;// 2. $this// 3. 与当前参数重名不让用//闭包经常用作函数的返回值function getUrl($site){return function ($color) use ($site){return sprintf("<h3 style='color:%s'>%s<h3>",$site,$color);};}echo getUrl('red')('php.cn');//打印 <h3 style="color:red">php.cn</h3>
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号