函数的类型
<?php
// 函数的类型 分为命名函数和不命名函数
// 命名函数分为 自定义函数、系统函数、可变函数。
// 不命名函数又叫做匿名函数。 php中匿名函数可以理解为闭包。而在js中不等于闭包。js中闭包包含范围更大。
// 1、自定义函数
// 相同函数都应该每个函数都用一个命名空间不然会出差错
// 如namespace ns1 ,没有只有namespace ns2就会报错
// 命名空间
// 不同的目录下面可以有相同的文件名
namespace ns1;
function a(int $a,int $b):int
{
//有return这样明显的返回叫做显示返回
return $a+$b;
}
echo a(1,2);
echo '<hr>';
namespace ns2;
// 注意函数开括号后面:int...只有在用return时才可以用
// 像直接用echo 再用 :返回类型就会出错
function a($a,$b)
{
//没有return这样的返回叫做隐式返回
// 这里直接打印
echo $a+$b;
}
a(21,2);
echo '<hr>';
// 函数名字起名
// getPrice: 小驼峰命名法:除了第一个首字母外其他单词的首字母大写
// get_price: 蛇形命名法:中间用下划线连接
// 2、系统函数:系统定义过的我们不需要在定义的函数
// 例如:mb_substr(函数名,起始索引,读取个数);自定义读取字符串系统函数
$i = 'abcdefg';
echo mb_substr($i,0,6);
echo '<hr>';
// 由于软件原因可变参数放到下一页
// 4、匿名函数,又叫闭包函数 可以访问父作用域的变量
// 匿名函数没有名字可以直接赋值给一个变量
// 这时变量名就相当与函数名一样
// 对于匿名函数来说可以用use()获取外部变量
echo '<hr>';
$t = 4;
$b = function(int $i,int $p)use($t)
{
echo $i += $p,$t;
// 注意赋值给变量时要在结尾框加 ';'
};
echo $b(1,2);
echo '<hr>';
// 匿名函数还可以在函数里
// 如果父作用域又是一个函数
// 对于匿名函数来说父级参数无法直接使用但可以用use()调用父级函数的参数变量,
function num($a)
{ $c = function(int $i,int $p)use($a)
{
echo $i += $p;
// 注意赋值给变量时要在结尾框加 ';'
};
return $c;
}
num(3)(2,2);
echo '<hr>';
namespace ns5;
// 上面的那个有点麻烦开始简化
// use在匿名函数中还有引进父级函数变量的作用,当在父级函数中将无法在调用在全局域中的变量会报错
// 除非变量是函数的私有变量才可以调用注意只可以调用一个
function num($a)
{ $e=3;
return function(int $i,int $p)use($e)
{//应为不是return所以不可以加 : 返回类别
echo $i += $p,$e;
// 注意赋值给变量时要在结尾框加 ';'
};
}
num(1)(2,2);
函数返回值
<?php
// 这从从新演示可变函数
// 可变函数
// 当处在命名空间中的时候将无法进行可变函数 会报错
$a='bgm';
// 注意函数开括号后面 :int...只有在用return时才可以用
// 像直接用echo 再用 :返回类型 那样就会出错
function bgm (int $i,int $p)
{
return $i += $p;
}
bgm(1,1);
echo $a(2,2);
echo '<hr>';
//函数返回值
// 1、字符串拼接
// 适合处理大量的php+html混写
// 这种返回的格式是用户自定义的,前端处理非常麻烦
function q()
{
$a='你好';
$b='我好';
// 注意通常只能返回一个字符串相反回多个要用‘.’不能用‘,’ 会出错
// return $a,$b;
return $a.$b;
}
echo q();
echo '<hr>';
// 数组返回值
function w():array
{
$i=['s'=>1,'t'=>'你好'];
return $i;
}
print_r(w());
// %s是占位符
printf('<pre>%s</pre>',print_r(w(),true));
echo '<pre>'.print_r(w(),true).'</pre>';
echo '<hr>';
// 通过JSON返回
// json: 是用js对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式
// json本质上就是一个具有一定结构和格式的字符串, 不过这种格式得到了公认,几乎所有编程语言都有支持它的接口
function e()
{
// json_encode(): 将php数据编码为json格式的字符串返回
$i=['s'=>1,'t'=>'你好'];
return json_encode($i);
}
echo e(),'<br>';
$aa=json_decode(e(),true);
echo '<hr>';
// 将json格式的字符串还原/解析为php对象/数组
// 不能用逗号只能用点,但用了没有效果
print_r($aa).'<br>';
// 这个<br>才起到效果
echo '<br>';
print_r(json_decode(e(),true));
echo '<hr>';
// 4. 通过序列化返回多个值
// 其实json也是一种序列化
// serialize()
function r()
{$i = ['你好','我好','大家好',1];
return serialize($i);
}
echo r();
echo '<hr>';
// 反序列化才可以使用
$arr =unserialize(r());
printf('<pre>%s</pre>', print_r($arr,true));
// 注意只有匿名函数可以作为值赋值给变量
// 若想将正常函数付给变量那么变量不能带参数
$i = function ($tr)
{$i = ['你好','我好','大家好'];
return $tr;
};
echo $i('a');
函数参数类型
<?php
// 函数参数
// 1. 值参数
// 2. 引用参数
// 3. 默认参数
// 4. 剩余参数
// 1. 值参数
// 命名空间 相当于在不同目录下面 可以在不同空间用相同的函数
// 但是注意可变函数在命名空间中无法使用 应该是个BUG
namespace bs1;
$i = 1;
function q($a)
{ $a=$a*2;
return $a;
}
echo q($i),'<br>';
echo $i,'<br>';
echo '<hr>';
namespace ns2;
$i = 1;
// &取地址符又叫引用符
// 和变量的值传递一样
// 2. 引用参数
function q(&$a)
{ $a=$a*2;
return $a;
}
echo q($i),'<br>';
echo $i,'<br>';
echo '<hr>';
namespace ns3;
$i = 1;
// $p=3就是默认参数不用单独设置
// 当然也可以设置,设置后数值为设定的数值
// 注意默认参数必须要在形式参数的后面不然会出问题
function q($a,$p=3)
{ $a=$a*2;
return $a.$p;
}
echo q($i),'<br>';
// 默认参数设置后数值为设定的数值
echo q($i,2),'<br>';
echo '<hr>';
namespace ns2;
$i = 1;
echo '<hr>';
// 4. 剩余参数 当我们需要的参数很多时不可能在用手一个一个的打上去使用可以用剩余参数
// 注意调用参数和形式参数都是 ...加数组的变量名
// 我们可以用 ... 参数归纳
// ... 有两个用法
// 1、在形式参数中起到聚集参数打包到一个数组中
// 2、在调用参数中起到将数组在的参数展开成一个个离散的值
namespace ns4;
function w(...$b)
{
// 数组求和
// 注意这里只能填参数不能加 ... 不然会报错
return array_sum($b);
}
$a=[1,2,3,4,5,6,7,8,9];
// 注意这里要加 ... 不然会报错
echo w(...$a),'<br>';
// 当然也可以直接将参数写在函数括号里
echo w(1,2,3,4,9,9,9,9,9),'<br>';
echo array_sum($a);
echo '<hr>';
// 扩展知识
$user[] = [100, 'admin', 90];
$user[] = [110, 'peter', 60];
$user[] = [120, 'jack', 98];
// 数组解包
// js中解构赋值, php中也有解构
foreach ($user as list($id, $name)) {
printf('id=%s, name=%s<br>', $id, $name);
}