函数的申明与调用;
使用function 申明:
例如:function 函数名称(参数){
具体执行的函数体;
}
函数命名方法:
小写字母/数字或下线且不允许使用数字开头,并且命名的时候最好是有一定意义。
function get_user_name(int $user_id){}
function get_password(int $user_id){}
function error_msg(string $str){}
自定义函数的申明与调用;
//函数声明:求两个参数的和
function sum(float $x,float $y) :float{
return $x + $y;
}
//调用
echo sum(10,10);
//输出:20
函数类型
系统函数:
系统给我们提供了若干函数
// 1、所有的字符都转小写(针对英文字母)
echo strtolower('ABCDEFG');
// 2、字符串分割数组,语法:str_split(字符串,数组元素的长度)
print_r(str_split("aaabbbccc",3));
// 3、四舍五入
echo round(3.5);
可变函数
//函数声明:求两个参数的和
function sum(float $x,float $y) :float{
return $x + $y;
}
// 1、定义值为函数名称的变量
$sum2='sum';
// 2、使用可变变量输出函数
echo $sum2(10,10);
echo '<br>';
// 使用函数输出结果相同
echo sum(10,10);
匿名函数(也叫具名函数/闭包)
//将一个没有函数名的函数赋值给一个变量
$sum = function(float $x,float $y) :float{
return $x + $y;
};
echo $sum(10,10);
闭包可以从父作用域中继承变量
$msg = 'hello';
// 使用use()继承$msg变量
$msg_str = function () use ($msg) {
return $msg;
};
echo $msg_str();
函数的返回值
函数必须要有返回值,正常情况下只能返回单一的值(如不能同时输出两个变量),可以通过以下方式返回不同类型的值:
通过字符串拼装
function demo(): string
{
$status = 1;
$msg= '成功';
return $status . $msg;
}
echo demo();
//输出:1成功
//通过数组返回
function demo(): array
{
$user_id =1;
$user_name='张三';
return ['id' => $user_id, 'name' => $user_name];
}
print_r(demo());
// 输出:
// Array
// (
// [id] => 1
// [name] => 张三
// )
//通过json返回字符串
function demo(): string
{
$user_id =1;
$user_name='张三';
return json_encode(['id' => $user_id, 'name' => $user_name]);
}
echo demo();
// 输出:{"id":1,"name":"\u5f20\u4e09"}
//也可以使用json_decode()转回数组;(不加第二个参数默认转换为对象)
print_r(json_decode( demo(), true));
//通过序列化方式返回字符串
function demo(): string
{
$user_id =1;
$user_name='张三';
return serialize(['id' => $user_id, 'name' => $user_name]);
}
echo demo();
// 输出:a:2:{s:2:"id";i:1;s:4:"name";s:6:"张三";}
//a表示数组,2个元素,
//第1个元素键名为id为string类型,长度是2,值为int类型,长度是1
//第2个元素键名为name为string类型,长度是4,值为string类型,长度是6
// 反序列化: 还原
print_r(unserialize( demo()));
函数中的参数
普通参数
//函数声明:求两个参数的和
function sum(float $x,float $y) :float{
return $x + $y;
}
//调用
echo sum(10,10);
//输出:20
//指定了两个float类型参数x,y,未指定默认值
//默认值参数
//函数声明:求两个参数的和
function sum(float $x,float $y=10) :float{
return $x + $y;
}
//调用
echo sum(5);
//输出:15
//指定了两个float类型参数x,y,其中y指定了默认值10;
//凡是有默认值的参数,必须写到没有默认值参数的后面
//注意 引用参数,要在参数前添加取地址符&
function sum(float &$y) :float{
return $y*=2;
}
$p=5;
//在函数参数中引用变量$p
echo sum($p);
//函数内部对参数的更新会实时映射到外部实际参数$p
echo $p;
//简单理解就是同步更新引用变量
//剩余参数
// 例如:一个数量不固定的数求和,参数前面加...
function demo(...$num)
{
//array_sum为数组求和函数
return array_sum($num);
}
// 定义数组
$arr = [2,2,2,2,2];
// 无论数组有多少个,全部进行计算
$num_sum = demo(...$arr);
echo $num_sum;
函数的命名空间
函数在同一空间中,同样不允许有多个同名函数,就等同于一个文件夹里不允许有两个相同文件。(如一个文件夹里不能同时有两个11.txt)
解决命名冲突:使用命名空间
// 函数的命名空间
namespace ns1 {
function demo(){
return '我是ns1的DEMO';
}
}
namespace ns2 {
function demo(){
return '我是ns2的DEMO';
}
}
// 全局空间: 匿名空间,默认空间
namespace {
function demo(){}
echo ns1\demo();
}
总结:
函数的使用前期自学基本使用没有问题,通过学习,有了更系统的理解;
对于回调函数,异步编程中的函数的参数还不能完全理解。