概念总结
函数: 在php中可分为php内置函数和用户自定义函数,
// 函数可以理解为 能够实现某个功能的代码块,时代码重用的一个手段;函数在定义的时候不会执行,在调用的时候才会执行;
// 函数的申明,通过 function 关键字开头 ,函数名通过 下划线'_' 字母开头,函数名对大小写不敏感;
// 函数具有返回值,通过 return 返回,函数只有一个返回值,如果要返回多个值,可以返回 数组、对象(匿名类方式)、或json 字符串
//函数具有参数, 在函数调用的时候传入的参数 叫做实际参数,函数名后面的产生 称为形式参数,用于接收实际参数,
// 函数的参数默认时通过值传递的方式,在函数内部对参数的改变不会影响函数外面的参数的值;
//如果须要改变函数外面参数的值,可以通过引用的方式传参,在形参前面加一个取地址符 & ;function getName(&$name){}
//函数 的作用域: 函数
// 闭包: php 官方手册给出的定义是: 闭包函数就是匿名函数; 就是没有函数名(标识符)的函数,它可以赋值给一个变量,通过变量名调用,
// 闭包最常用的 场景就是,作为函数的返回值返回,后赋值给一个变量,再进行使用。
// 闭包可以冲父作用域中继承变量,但是 要 使用 use 关键字传递进去,
// use 不能用于一下情形: 超全局变量、$this、 当前函数参数同名的变量;
// 函数 的作用域: php函数内定义的变量属性函数内,称为局部作用域,函数外申明的变量称为全局作用域;
// php中作用域不重叠,函数内部不能访问函数外部的变量(可通过global关键字或$GLOBALS超全局变量访问),函数内申明的变量不能在函数外访问,预定义的超全局变量可以在整个脚本使用
代码演示
$a = 456;
// 函数申明和函数作用域
function getName()
{
$a = 789;
echo $a;
}
echo $a; // 输出456
echo '<hr>';
getName(); //输出 789
//通过实例我们可以看出函数内部不能直接使用函数外部的全局变量
function getName1()
{
//通过global 关键字使用函数外部全局变量
global $a;
$a = 999;
echo $a . '<br>';
}
getName1();
echo $a;
$a = 80;
echo $a;
// globla 关键字是直接引用(引用传值)函数外部的全局变量到函数内部使用,如果从新赋值,会改变变量初始
echo '<hr>';
$b = 5678;
function getName2()
{
//通过超全局变量 $GLOBALS 在函数内部访问函数外部的全局变量
$c = $GLOBALS['b'];
$c = 5680;
return $c += 2;
}
echo getName2();
echo $b;
//通过超全局变量 $GLOBALS 在函数内部使用全局变量,在函数内对变量进行重新赋值,不会改变原变量数据
echo '<hr>';
//函数内 静态变量 static 关键字定义:静态变量在函数调用执行后不会立即释放内存,可以保持该变量的值,
function getName3()
{
// static $num = 0;
for ($num = 0; $num <= 100; $num++) {
echo $num . '<br>';
}
}
getName3(); // 输出0-100 的整数;这个例子没有举对;
echo '<hr>';
function getNum($u)
{
static $n = 0; //每调用一次函数 就更新一下$n
$n++;
echo "\$n自身的值:$n" . '<br>';
return "\$n和\$u相加后的和:$n + $u =" . ($n + $u) . '<br>';
}
echo getNum(1); // 输出2
echo getNum(1); // 输出3
echo getNum(1); // 输出4
echo getNum(1); // 输出5
echo '<hr>';
//函数外部访问函数内部变量;
//(这个逻辑是错误的,因为函数内的代码块是在函数调用执行的时候才创建,函数执行完毕后就没有了,所以在函数外部是访问不到函数内部的变量的,只有在函数执行的时候,把须要的值通过返回值的方式获得,)
function getColor()
{
static $color = 'red';
}
//调用函数
getColor();
echo $color; //没有任何输出,因为函数内申明的变量, 是局部变量,不能在函数外面使用,
var_dump($GLOBALS['color']); //通过$GLOBALS 超全局变量 也不能直接获取函数内部申明的局部变量
// 上面 输出 : NULL
global $color;
echo $color . '<br>';
var_dump($color); // 同 $GLOBALS 一样 输出NULL
getColor();
echo '<hr>';
function getColor1()
{
$color = 'red';
return $color; //要获取函数内部申明的局部变量 可以通过 函数返回值的方式
}
echo getColor1(); // 输出 red;
echo "<hr>";
// 递归 : 函数自己调用自己
function myExe()
{
static $a = 0; //申明一个静态变量
$a++;
if ($a <= 10) {
echo "\$a等于$a" . '<br>';
myExe();
}
}
myExe();
echo "<hr>";
//函数的参数
//可分为: 必填参数、选填参数(就是函数的形参有默认值,)不定参数(假定在不知道参数个数的情况下使用 ... ,可以把多个参数集合到一个数组中)
// 必填参数
function show($a)
{
echo $a;
}
//show();// 如果不传参数会报错
show('hello 如来');
echo '<hr>';
//选填参数
function show1($a = '我是观音姐姐')
{
echo $a;
}
show1(); // 由于形参有 默认参数,所以在调用函数的时候不传参数 ,函数也是可以正常执行的,
echo "<hr>";
show1('我是观音姐姐的粉丝');
echo "<hr>";
//不定参数
function getSum(...$arr)
{
//php 预定义函数 array_sum() 函数,专门用于数组求和
return array_sum($arr);
}
echo getSum(10, 20, 30, 40, 50, 60,);
echo "<br>";
echo getSum(10, 20, 30);
echo "<hr>";
//闭包 :闭包 可以理解为匿名函数
// 申明一个匿名函数 并赋值给变量$color,这个匿名函数 可以理解为$color 的值,{}后面须要写 分号,不然语法错误;调用的时候也用函数的方式调用;
$color = function ($a, $b) {
return $a + $b;
};
echo $color(5, 2);
echo "<hr>";
//闭包(匿名函数) 可以继承父作用域的 变量,使用 use 关键字 引入父作用的变量,
// use 关键字不能引入 :$this 、 函数形参变量名相同的变量 、 php超全局变量
$ab = 10;
$abc = 81;
$summ = function ($a, $b) use ($ab, $abc) {
echo $a + $b + $ab + $abc;
};
$summ(5, 4);
echo "<hr>";
// 闭包中的引用传值
$col = 'red';
$color = function (&$col) {
$col = $col;
echo $col . '<br>';
$col = 'blue';
echo $col . '<br>';
};
$color($col);
echo '<br>';
echo "在函数内从新赋值后的全局变量:\$col 值等于:$col";
echo '<hr>';
//回调异步执行函数 call_user_func_array(函数,[函数参数数组形式])
function getUser($user)
{
return $user .= '生活在伟大的中华人民共和国,他乐观、积极并且乐于助人';
}
echo getUser('小明'); //正常调用
echo '<hr>';
echo call_user_func_array('getUser', ['小红']);
echo "<hr>";
//函数返回值
// 函数只能返回一个值:如果要返回对个值,可以改变返回值的数据类型, 改为数组、对象(通过匿名类)、json 等
// 返回单个值
function getAge($age)
{
return $age; //直接返回
}
echo getAge(66); //返回单个值
echo '<hr>';
// 通过数组形式 返回多个值
function getAge1(...$age)
{
$ages[] = $age;
// $ages[] = 100;
return $ages; //返回数组
}
var_dump(getAge1(11, 33, 44));
echo '<hr>';
function getAge2($a, $b, $c)
{
$ages[] = $a;
$ages[] = $b;
$ages[] = $c;
// $ages[] = 100;
return $ages; //返回数组
}
var_dump(getAge1(11, 33, 44)); // 返回的是一个二维数组
echo '<hr>';
// 通过对象(匿名类的方式)的形式返回对个值
function getAge3()
{
return new class()
{
public $name = '御弟哥哥';
public $age = 1000;
}; // 匿名类后面的 花括号 要加分号 结束;
}
//把返回的对象 用一个变量接收
$obj = getAge3();
echo $obj->name;
echo '<br>';
echo $obj->age;
echo '<hr>';
//通过 json 格式 返回多个值
function getUser4(): string
{
$users = ['id' => '1', 'name' => '包租婆', 'age' => '50', 'sex' => '女'];
return json_encode($users, JSON_UNESCAPED_UNICODE);
// return json_encode(['id' => '1', 'name' => '包租婆', 'age' => '50', 'sex' => '女'], JSON_UNESCAPED_UNICODE);
}
$users = getUser4();
var_dump($users);
echo $users;
echo '<hr>';
//通过 json_decode()函数 把 json数据 解析并赋值到变量
//解析之后 默认是对象方式调用;
$user = json_decode($users);
echo $user->id;
echo $user->name;
echo '<hr>';
//json_decode() 函数 默认以对象方式返回,如果想以数组的方式返回数据,须要使用第二个参数,设置为true
$user = json_decode($users, true);
var_dump($user);
echo '<br>';
echo $user['id'];
echo $user['name'];
echo $user['sex'];
echo '<hr>';
//通过php内置序列化函数返回多个值
// serialize() 函数 (序列化)产生一个可存储的值的表示,(不说人话),返回一个脂字符串,可用于储存在任何地方。
// 这有利于存储或传递php的值,同时不丢失其类型和结构。
//resource 类型不能不序列化,其他类型都可以被序列化
// unserialize() 函数 (反序列化) 将已经序列化的字符串变化php的值。
function getRes()
{
$ress = ['id' => '1', 'name' => '黑熊精', 'age' => '10000', 'sex' => '公'];
return serialize($ress); //将数组通过序列化成字符串的方式返回给函数,
}
$ress = getRes();
var_dump($ress);
echo '<hr>';
//将被序列化为字符串的 php数据,转为正常的php 数据
$res = unserialize($ress);
var_dump($res);//打印反序列化后的数组