一、函数
在PHP程序编译时,函数是不分大小写的,变量区分大小写,这个和其他编程时有所不同;
1.1 函数语法
function 函数名称(限定类型 参数列表) : 返回值类型
{
// 函数体
return 返回值;
// 没有return,返回NULL
}
1.2 函数声明
函数声明分为命名函数和匿名函数
函数声明 | 标识 | 特点 |
---|---|---|
命名函数 | 标识符 | 命名函数自动提升到脚本的顶部,在全局任何地方都可以调用到 |
匿名函数 | 变量 | 需要定义变量才能够调用,不能够在函数未定义前调用 |
- 命名函数
function site(){
echo 'php.cn';
}
echo site();
- 匿名函数
$url = function(){
return 'www.baidu.cpm';
};
echo $url();
二、函数的返回值
函数只允许有一个返回值,当我们需要返回多个值的时候,又应该如何解决呢?
2.1 数组
//数组
function state(): array
{
return ['status' => '1', 'message' => '验证通过'];
}
$res = state();
//var_dump($res);
echo $res['status'] == 1 ? $res['message'] : '验证失败';
//打印 验证通过
2.2 对象
//对象
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
2.3 序列化
函数 | 描述 |
---|---|
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、python
function 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) "验证成功" }
三、函数的参数
函数的参数传参有多种形式,可以应用在不同的实战场景
3.1 必选参数
//必选参数
function userName($name) : string
{
return 'Hello ' . $name;
}
echo userName('Tome');
3.2 可选参数
//可选参数
function userName($name = 'Tome') : string
{
return 'Hello ' . $name;
}
echo userName();
//打印 Hello Tome
echo userName('Jack');
//打印 Hello Jack
//如果输入参数会覆盖默认参数值
3.3 不定参数
//不定参数
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 '连接失败';
}
3.4 引用参数
//引用参数
//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
四、函数作用域
函数作用域,只有调用它的时候才会被创建
4.1 global
$name = 'Tome';
function getUser() : string
{
//函数作用域,只有调用它的时候才会被创建
$res = '';
//如果想在函数内部访问全局/外部的成员
//有二种方式可以在函数内部访问外部成员
//1. global
global $name;
$res .= '$name = ' . $name . '<br>';
return $res;
}
echo getUser();
//打印
// $name = Tome
4.2 $GLOBAL
超全局数组不受作用域限制
$email = '923617189@qq.com';
function getUser() : string
{
//函数作用域,只有调用它的时候才会被创建
$res = '';
//$GLOBALS,超全局数组不受作用域限制
$res .= '$email = ' . $GLOBALS['email'];
return $res;
}
echo getUser();
//打印
// $email = 923617189@qq.com
五、闭包函数
闭包也叫匿名函数
5.1 use
//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>