PHP 基础案例教程之 03-函数

函数的定义与调用

初识函数

在程序开发中,通常通过定义一个函数来实现特定的功能,从而使代码可以被复用,避免重复编写相同功能的代码。

函数的基本用法:

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>

示例效果:


相关推荐
两个人的幸福10 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo12 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack12 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820712 天前
PHP 扩展——从入门到理解
php
鹏仔先生13 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下13 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip13 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒14 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog25014 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis14 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel