函数的定义与调用
初识函数
在程序开发中,通常通过定义一个函数来实现特定的功能,从而使代码可以被复用,避免重复编写相同功能的代码。
函数的基本用法:
PHP
function 函数名([$参数1, $参数2]) {
函数体
[return 函数返回值;]
}
对于函数而言,设置参数的方式不同,其调用方式也不同。
无参函数
定义无参数的函数时,不需要传递参数,函数体用于完成指定的功能。
示例:无参函数
入口页面(index.php):
PHP
<?php
function sout() {
return "Hello PHP";
}
echo sout();
示例效果:

有参函数
定义有参数的函数时,函数内部会根据用户传递的参数进行操作。
示例:有参函数
入口页面(index.php):
PHP
<?php
function add($a, $b){
return $a + $b;
}
echo "1 + 2 = ".add(1, 2);
示例效果:

引用传参
当需要函数修改它的参数值时,需通过函数参数的引用传递来实现,即引用传参。
在函数中使用引用传参的基本用法:
PHP
function 函数名(&$参数) {
函数体
[return 函数返回值;]
}
示例:引用传参
入口页面(index.php):
PHP
<?php
function extra(&$message){
$message = $message." PHP";
}
$message = "hello";
extra($message);
echo $message;
示例效果:

参数默认值
在设置函数参数时,还可以为其指定默认值,即可选参数,当调用者未传递该参数时,函数将使用默认值进行操作。
指定函数的参数默认值的基本用法:
PHP
function 函数名($参数 = 参数默认值) {
函数体
[return 函数返回值;]
}
示例:参数默认值
入口页面(index.php):
PHP
<?php
function say($name, $message = "Hello~"){
return $name . " say " . $message;
}
echo say("Tom");
示例效果:

参数类型
在自定义函数时,可以指定参数具体是哪种数据类型。
- 在 PHP 5 中不能直接指定诸如整数、浮点数、字符串等基本数据类型作为参数类型。
- 在 PHP 7 中,类型声明得到了显著增强,可以更精确地指定各种基本数据类型。
一般情况下,指定参数类型的方式是弱类型参数设置,在调用函数时,如果传递的参数不是指定的类型,程序会将其强制转换成指定类型再进行操作。
设置函数的弱类型参数的基本用法:
PHP
function 函数名(参数类型 $参数) {
函数体
[return 函数返回值;]
}
示例:参数类型
入口页面(index.php):
PHP
<?php
function add(int $a, int $b){
return $a + $b;
}
echo "2.6 + 3.8 = ".add(2.6, 3.8);
示例效果:

在 PHP 中,还可以将函数参数设置为强类型参数,当用户传递的参数类型不符合函数的定义时,程序会报错提醒。
设置函数的强类型参数的基本用法:
PHP
declare(strict_types = 1);
function 函数名(参数类型 $参数) {
函数体
[return 函数返回值;]
}
示例:设置函数的强类型参数
入口页面(index.php):
PHP
<?php
declare(strict_types = 1);
function add(int $a, int $b) {
return $a + $b;
}
echo "2.6 + 3.8 = ".add(2.6, 3.8);
示例效果:


可变参数列表
从 PHP 5.6 及以上版本开始,在定义函数时,可以指定可变参数列表,即函数可以接受不定数量的参数。
指定函数的可变参数列表的基本用法:
PHP
function 函数名(...$参数) {
函数体
[return 函数返回值;]
}
在指定函数的可变参数列表时,需要注意:
- 可变参数列表只能用在参数列表的末尾。
- 可变参数列表的数量可以为 0,但不能省略。
- 在使用可变参数列表时,函数会自动将参数转化为数组,可以使用数组相关的函数来操作这些参数。
示例:可变参数列表
入口页面(index.php):
PHP
<?php
function num(...$num) {
echo var_dump($num);
}
echo num(1, 2, 3, 4, 5, 6, 7);
示例效果:

函数返回值类型
从 PHP 7 开始,引入了对函数返回值类型声明的强大支持,允许明确指定函数返回的数据类型。
指定函数返回值类型的基本用法:
PHP
declare(strict_types = 1);
function 函数名(参数类型 $参数) : 返回值类型 {
函数体
[return 函数返回值;]
}
示例:函数返回值类型
入口页面(index.php):
PHP
<?php
declare(strict_types = 1);
function returnIntValue(int $value) : int {
// int + float = float
return $value + 1.0;
}
echo returnIntValue(5);
示例效果:


函数中变量的作用域
变量只有在其作用范围内才可以被使用,这个作用范围称为变量的作用域。
- 在函数中定义的变量称为局部变量,在函数外定义的变量称为全局变量。
- 默认情况下,在函数中不能使用全局变量。
- 局部变量的改变,不会对全局变量有任何影响。
示例:函数中变量的作用域
入口页面(index.php):
PHP
<?php
$sum = 0;
function test() {
$sum = 36;
return $sum;
}
echo 'test() => '.test();
echo "<br>";
echo '$sum => '.$sum;
示例效果:

若要在函数中使用全局变量,可以使用 global 关键字或超全局变量 $GLOBALS。
global 关键字的基本用法:
PHP
function 函数名() {
global $全局变量名;
}
超全局变量 $GLOBALS 的基本用法:
PHP
function 函数名() {
$GLOBALS['全局变量名'];
}
示例:全局变量
入口页面(index.php):
PHP
<?php
$sum1 = 0;
$sum2 = 100;
function test() {
global $sum1;
echo '全局变量 $sum1 => '.$sum1;
echo "<br>";
echo '全局变量 $sum2 => '.$GLOBALS['sum2'];
}
test();
示例效果:

函数的嵌套调用
嵌套调用
嵌套调用是指在调用一个函数的过程中,调用另一个函数。
示例:嵌套调用
入口页面(index.php):
PHP
<?php
function sum($sub1, $sub2) {
return $sub1 + $sub2;
}
function avg($sub1, $sub2) {
$sum = sum($sub1, $sub2);
return $sum / 2;
}
echo avg(92, 90);
echo "<br>";
echo avg(78, 56);
示例效果:

递归调用
递归调用时函数嵌套中的一种特殊的调用,是指函数在其函数题内调用自身的过程。
示例:递归调用
入口页面(index.php):
PHP
<?php
function factorial($n) {
if ($n == 0) {
return 1;
} else {
return $n * factorial($n - 1);
}
}
echo factorial(5);
示例效果:

函数的高级应用
静态变量
在 PHP 函数中,执行完函数后,在函数中定义的变量会被释放或者被重新赋值,若想在函数执行完成后依然保留局部变量的值,可以使用静态变量。
静态变量的基本用法:
PHP
static $变量名 = 变量值;
示例:静态变量
入口页面(index.php):
PHP
<?php
function num1() {
$num = 0;
$num++;
// num1函数中的变量$num在每一次调用函数时都会重新被赋值
return $num;
}
function num2() {
static $num = 0; // 静态变量
$num++;
// num2函数中定义了静态变量,变量$num在每一次调用函数时不会重新被赋值
// 重复调用num2函数,变量$num自增
return $num;
}
for($i = 0; $i < 5; $i++) {
echo num1().", ";
}
echo "<br>";
for($i = 0; $i < 5; $i++) {
echo num2().", ";
}
示例效果:

可变函数
可变函数就是将一个变量变成一个函数的形式,PHP 会自动寻找与变量值同名的函数,并且尝试执行它。
可变函数的基本用法:
PHP
$变量名 = 变量值;
$变量名();
在使用可变函数时,需要注意:
- 变量值可以是用户自定义的函数名称,也可以是 PHP 内置的函数名称,但是变量值必须是实际存在的函数的名称。
- 使用可变函数可以增加程序的灵活性,但是滥用可变函数会降低 PHP 代码的可读性。
示例:可变函数
入口页面(index.php):
PHP
<?php
function test() {
echo "Hello PHP";
}
$functionName = "test";
// $functionName() = test()
$functionName();
示例效果:

回调函数
回调函数是指将一个函数作为参数传递给另一个函数,然后在适当的时候被调用执行。
示例:回调函数
入口页面(index.php):
PHP
<?php
function sum($a, $b) {
return $a + $b;
}
// call_user_funch函数可以接受用户自定义的回调函数作为参数
// 参数1:回调函数名
// 参数...:传递给回调函数的参数
// call_user_func函数执行后,将调用sum函数并返回执行结果
echo call_user_func('sum', 1, 2);
示例效果:

回调函数具有很大的灵活性和实用性,可以用于数据排序、数组过滤、文件处理等场景。
匿名函数
匿名函数就是没有函数名称的函数,也称为闭包函数,其强调的是函数本身没有名称,需要通过变量来引用和使用。
匿名函数的基本用法:
PHP
$变量名 = function() {
函数体
[return 函数返回值;]
};
$变量名();
示例:匿名函数
入口页面(index.php):
PHP
<?php
$sum = function ($a, $b) {
return $a + $b;
};
echo $sum(1, 2);
示例效果:

若要在匿名函数中使用外部的变量,可以使用 use 关键字来实现。
匿名函数使用外部变量的基本用法:
PHP
$变量名 = function() use ($变量名) {
函数体
[return 函数返回值;]
};
$变量名();
示例:匿名函数使用外部变量
入口页面(index.php):
PHP
<?php
$c = 100;
$sum = function ($a, $b) use($c) {
return $a + $b + $c;
};
echo $sum(1, 2);
示例效果:

匿名函数还可以作为函数的参数传递,实现回调函数。
示例:匿名函数作为函数的参数传递
入口页面(index.php):
PHP
<?php
function calculate($a, $b, $func) {
// 调用回调函数func
return $func($a, $b);
}
// 调用calculate函数时,传入一个回调函数
echo calculate(10, 20, function ($a, $b) {
return $a + $b;
});
echo "<br>";
echo calculate(10, 20, function ($a, $b) {
return $a * $b;
});
示例效果:

PHP 内置函数
字符串函数
字符串的基本函数:
| 名称 | 描述 |
|---|---|
| strlen($string) | 获取字符串的长度,一个英文字符、一个空格的长度均为 1 UTF-8 字符集的中文字符长度为 3 GBK 字符集的中文字符长度为 2 |
| mb_strlen($string) | 获取字符串的长度,1 个中文字符长度为 1 在使用该函数时,需确保 PHP 配置文件开启 mbstring 扩展 |
| strpos(string, find) | 在字符串中查找另一个字符串首次出现的位置 |
| strrpos(string, find) | 在字符串中查找另一个字符串最后一次出现的位置 |
| str_replace(find, replace, $string) | 替换字符串中的一些字符 |
| substr_replace(string, replace, $start) | 替换字符串的一部分 |
| substr(string, start, $length) | 截取字符串的一部分 |
| explode(separator, string) | 将字符串按照指定的分隔符分割成数组 |
| implode(separator, array) | 将数组元素连接成一个字符串 |
| trim(string, charlist) | 去除字符串两端的空白字符或其他预定义字符 |
| str_repeat(string, repeat) | 重复指定的字符串指定的次数 |
| strcmp(string1, string2) | 比较两个字符串是否相等 该函数二进制安全,且区分大小写,函数返回 0 即字符串相等 |
示例:字符串函数
入口页面(index.php):
PHP
<div>strlen+mb_strlen获取字符串长度:</div>
<?php $str1 = "多仔的PHP笔记"; ?>
<div>$str1:<?php echo $str1; ?></div>
<div>$str1的长度是:<?php echo strlen($str1); ?></div>
<div>$str1的长度是:<?php echo mb_strlen($str1); ?></div>
<br>
<div>strpos+strrpos+substr截取字符串:</div>
<?php $str2 = "/Users/duozai/Desktop/demo.png" ?>
<div>$str2:<?php echo $str2; ?></div>
<div>"duozai" 第一次出现的位置:<?php echo strpos($str2, "duozai"); ?></div>
<div>"/" 最后一次出现的位置:<?php echo strrpos($str2, "/"); ?></div>
<div>截取文件名:<?php echo substr($str2, strrpos($str2, "/") + 1); ?></div>
<br>
<div>str_replace+substr_replace+str_repeat替换字符串:</div>
<?php $str3 = "+00 13200077700" ?>
<div>$str3:<?php echo $str3; ?></div>
<div>将 "+00" 替换成 "+86" :<?php echo str_replace("+00", "+86", $str3); ?></div>
<div>将手机号中间四位替换成*:<?php echo substr_replace($str3, str_repeat("*", 4), 7, 4); ?></div>
<br>
<div>explode+implode转换数组与字符串:</div>
<?php $str4 = "1,2,3,4,5,6,7" ?>
<div>$str4:<?php echo $str4; ?></div>
<div>将字符串转换成数组:<?php var_dump(explode(",", $str4)); ?></div>
<div>将数组转换成字符串:<?php echo implode("-", explode(",", $str4)); ?></div>
<br>
<div>trim去除字符串两端符号</div>
<?php $str5 = ",1,2,3,4,5,6,7," ?>
<div>$str5:<?php echo $str5; ?></div>
<div>去除两端逗号:<?php echo trim($str5, ","); ?></div>
<br>
<div>strcmp判断字符串是否相等</div>
<?php $str6 = "hello"; ?>
<?php $str7 = "Hello"; ?>
<div>$str6:<?php echo $str6; ?></div>
<div>$str7:<?php echo $str7; ?></div>
<div>$str6与$str7是否相等:<?php echo strcmp($str6, $str7); ?></div>
示例效果:

数学函数
数学的基本函数:
| 名称 | 描述 |
|---|---|
| abs($number) | 返回一个数的绝对值 |
| ceil($number) | 返回一个数向上取最接近的整数 |
| floor($number) | 返回一个数向下取最接近的整数 |
| round($number) | 返回一个数的四舍五入的整数 |
| min(...$value) | 返回一个数组中的最小值,或者几个指定值中的最小值 |
| max(...$value) | 返回一个数组中的最大值,或者几个指定值中的最大值 |
| pi() | 返回圆周率的值 |
| pow(x, y) | 返回一个数的指定次幂 |
| sqrt($number) | 返回一个数的平方根 |
| rand(min, max) | 返回一个随机整数 |
示例:数学函数
入口页面(index.php):
PHP
<div>-123的绝对值是<?php echo abs(-123); ?></div>
<div>19.8向上取整是<?php echo ceil(19.8); ?></div>
<div>19.8向下取整是<?php echo floor(19.8); ?></div>
<div>19.8四舍五入是<?php echo round(19.8); ?></div>
<div>2, 4, 8的最小值是<?php echo min(2, 4, 8); ?></div>
<div>2, 4, 8的最大值是<?php echo max(2, 4, 8); ?></div>
<div>圆周率的值是<?php echo pi(); ?></div>
<div>2的3次方是<?php echo pow(2, 3); ?></div>
<div>9的平方根是<?php echo sqrt(9); ?></div>
<div>1-100的随机数是<?php echo rand(1, 100); ?></div>
示例效果:

时间和日期函数
PHP 通过 UNIX 时间戳处理时间,UNIX 时间戳定义了从格林尼治时间 1970 年 1 月 1 日 0 时 0 分 0 秒起至当前时间的总秒数。
时间和日期的基本函数:
| 名称 | 描述 |
|---|---|
| time() | 获取当前的 UNIX 时间戳 |
| date(format\[, timestamp]) | 格式化一个本地时间或日期 |
| mktime(hour, minute, second, month, day, year) | 获取指定日期的 UNIX 时间戳 |
| strtotime($string) | 将字符串转换成 UNIX 时间戳 |
| microtime() | 获取当前 UNIX 时间戳和微秒数 |
日期时间格式的基本字符:
| 名称 | 描述 | |
|---|---|---|
| 年 | Y | 4 位数字表示的完整年份 |
| y | 2 位数字表示的年份 | |
| L | 是否为闰年,1 是/0 否 | |
| 月 | m | 数字表示的月份,有前导 0,返回值 01-12 |
| n | 数字表示的月份,无前导 0,返回值 1-12 | |
| t | 给定月份所应有的天数,返回值 28-31 | |
| F | 完整英文单词表示的月份 | |
| M | 三个字母缩写表示的月份 | |
| 日 | d | 月份中的第几天,有前导 0,返回值 01-31 |
| j | 月份中的第几天,无前导 0,返回值 1-31 | |
| 时间 | g | 小时,12 小时制,无前导 0,返回值 1-12 |
| h | 小时,12 小时制,有前导 0,返回值 01-12 | |
| G | 小时,24 小时制,无前导 0,返回值 0-23 | |
| H | 小时,24 小时制,有前导 0,返回值 00-23 | |
| i | 分钟,有前导 0,返回值 00-59 | |
| s | 秒数,有前导 0,返回值 00-59 | |
| 星期 | N | 星期几,返回值 1(星期一)-7(星期日) |
| w | 星期几,返回 0(星期日)-6(星期六) | |
| D | 三个字母缩写表示的星期 | |
| l | 完整英文单词表示的星期 |
示例:时间和日期函数
入口页面(index.php):
PHP
<div>当前时间戳:<?php echo time(); ?></div>
<div>当前时间戳和微秒:<?php echo microtime(); ?></div>
<div>当前日期:<?php echo date('Y-m-d H:i:s'); ?></div>
<div>2024年07月11日 08:00:00的时间戳:<?php echo mktime(8, 0, 0, 7, 11, 2024); ?></div>
<div>2024年07月11日 08:00:00的时间戳:<?php echo strtotime('2024-07-11 08:00:00'); ?></div>
示例效果:
