任何编程语言,都绕不开函数,只要有编程就会有函数,函数的最终目的就是实现代码的复用,减轻代码沉余。下面通过几个案例,带大家认识一下函数的基本概念
function getPrice(float $arg) : float
{
echo 'hello the world','<br>';
return $arg *= 2;
}
echo getPrich(2);
代码效果图:
hello the world
4
这是一个基本的函数,用中文翻译整个,可以得出如下
function 函数名(参数)
{
功能块;
}
// 调用函数如下
函数名(参数);
通过这个案例,我们可以知道函数的基本结构,那么函数肯定不仅仅只有这些,有自定义的函数,也有系统的函数,等等,我们来讲解一下
函数类型一共有四种,每种定义方式都不一样
序号 | 类型 | 语法 | 解释 |
---|---|---|---|
1 | 自定义函数 | function 函数名(){...} |
用户自定义的函数 |
2 | 系统函数 | mb_substr()... |
系统自带的函数,不需要定义,直接使用 |
3 | 可变函数 | $funcName = 函数名 |
函数名赋给变量,变量调用函数 |
4 | 匿名函数 | $a = function (){...} |
函数表达式 |
//需要声明函数名称,
function getPrice(float $money, float $discount) : float
{
return $money * $discount;
}
// 通过函数名来调用
echo '实付金额' . getPrice(100,0.1);
echo '<hr>';
代码效果图:
实付金额10
$str = '我是一个中国人';
// 系统函数不要声明,直接把要处理的数据传进去即可
echo mb_substr($str , 0 , 5);
echo '<hr>';
代码效果图:
我是一个中
更多系统函数可到手册中查看
// 将上面定义的函数,赋给一个变量,用变量来调用
$funcName = 'getPrice';
// 用变量来调用
echo '实付金额:' . $funcName( 400, 0.4);
echo '<hr>';
代码效果图:
实付金额:160
$discount = 0.8;
// 将使用的变量通过use传入函数
$getAmount = function (float $money, int $num) use ($discount) :float
{
$amount = $money * $num;
return $amount >= 2000 ? $amount * $discount : $amount;
};
echo '实付金额: ' . $getAmount(100, 10);
echo '<hr>';
代码效果图:
实付金额:1000
通过几个案例我们可以知道,函数有四种类型,每种类型定义的方式不一样,作用也不一样,我们可以看到在function
后面还紧跟着一个括号,这个括号里面就是我们要传入的参数,这个参数类型也有很多种。
函数参数类型,也有四种,和函数类型碰巧数量一致,我们来通过来了解一下。
序号 | 类型 | 语法 | 解释 |
---|---|---|---|
1 | 值参数 | function demo1(float $arg) : float |
把数值传入函数 |
2 | 引用函数 | function demo2(float &$arg) : float |
引用变量的地址 |
3 | 默认参数 | function demo3(float $a, float $b, string $opt = '+') |
不传入数据进入函数,函数默认的参数 |
4 | 剩余参数 | function demo6(...$args) : float |
当有多个值传入函数,函数的处理 |
function demo1(float $arg) : float
{
return $arg *= 2;
}
$value = 100;
echo demo1($value),'<br>';
echo $value;
echo '<hr>';
代码效果图:
200
100
值参数非常的简单,就是将变量的值,传入函数,理解起来非常简单,就是将变量的值,传进函数,函数进行处理,函数不会对原来的变量进行改变
function demo2(float &$arg) : float
{
return $arg *= 2;
}
$value = 100;
echo demo2($value). '<br>';
echo $value;
echo '<hr>';
代码效果图:
200
200
引用函数的地址,交给函数,此时我们可以发现,原来的值也发生了改变,这是为什么呢?这是因为我们引用了函数的地址,对变量的指向的数值进行了更新。
默认参数,就是,我们不传入参数,函数使用的默认的参数
function demo3(float $a, float $b, string $opt = '+')
{
$res = 0;
switch($opt) {
case '+':
$res = "$a + $b =" . ($a + $b);
break;
case '-':
$res = "$a - $b" . ($a - $b);
break;
case '*':
$res = "$a * $b=" . ($a * $b);
break;
case '/':
$res = "$a / $b" . ($a / $b);
break;
default:
$res = '非法操作符';
}
return $res;
}
echo demo3(10,20),'<br>';
echo demo3(10,20,'*');
echo demo3(10,30,'^');
echo '<hr>';
代码效果图:
30
200
非法操作符
所谓的剩余参数,就是当我们输入多个参数时,函数并没有声明,函数会如何处理。
// 函数声明变量时,用数组声明,前面用...表示多个
function demo6(...$args) : float
{
// 用数组求和函数,也就是系统自定义的函数,进行处理
return array_sum($args);
}
// print_r(demo6(3,4,7,8,89,23));
echo demo6(1,2,3,4,5,6,7,8,9),'<br>';
$arr = [1,2,3,4,5,6,7,8,9,10];
print_r(demo6(...$arr));
代码效果图:
45
55
通过剩余参数,我们可以知道,当函数有很多变量时,可以通过数组来接收,不需要定义很多参数来,非常的智能,解决了不规则参数的处理。既然有参数,那就有返回值,返回值也有很多类型
函数的返回值要遵循单值返回的原则。
序号 | 场景 | 描述 |
---|---|---|
1 | return |
可以返回任何类型的值 |
2 | 无return |
默认返回null |
序号 | 方式 | 描述 |
---|---|---|
1 | string |
字符串拼接 |
2 | array |
数组 |
3 | json |
JSON 字符串 |
4 | serialize |
序列化字符串 |
function demo1() : string
{
$status = 1;
$message = '成功';
// return只能返回单值
// return $status , $message;
return $status . ':' . $message;
};
代码效果图:
1成功
通过.
拼接,输出不同的变量,达到多值返回的目的。
function demo2() : array
{
return ['status'=>1, 'message'=>'成功'];
}
$res = print_r(demo2(), true);
printf('<pre>%s</pre>', $res);
echo '<hr>';
代码效果图:
1成功
//json:是用对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输方式
//json本质上就是一个具有一定结构和格式的字符串,不过这种格式得到了公认
function demo3() : string
{
return json_encode(['status'=>1, 'message' => '成功']);
}
echo demo3();
$data = demo3();
$var = json_encode($data, true);
print_r($var);
echo '<hr>';
代码效果图:
{"status":1,"message":"\u6210\u529f"}"{\"status\":1,\"message\":\"\\u6210\\u529f\"}"
function demo4() : string
{
return serialize(['status' =>1,'message'=>'成功']);
}
echo demo4();
echo '<hr>';
代码效果图:
a:2:{s:6:"status";i:1;s:7:"message";s:6:"成功";}
到这里函数的类型,参数类型,返回值类型都已经讲解完了,这只是一些基本知识,要想更深的理解,还需要更多的使用和运用。