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>

示例效果:


相关推荐
百***07452 小时前
小米MiMo-V2-Flash深度解析:国产开源大模型标杆+一步API接入全指南
java·大数据·开源·php
刃神太酷啦3 小时前
Linux 基础 IO 收官:库的构建与使用、进程地址空间及核心知识点全解----《Hello Linux!》(11)
java·linux·c语言·数据库·c++·算法·php
开开心心就好3 小时前
视频伪装软件,.vsec格式批量伪装播放专用
java·linux·开发语言·网络·python·电脑·php
weixin_BYSJ19873 小时前
django农作物批发交易系统--附源码24008
java·javascript·spring boot·python·django·flask·php
计算机毕业设计开发4 小时前
django高校公寓管理系统--附源码64226
java·c++·spring boot·python·spring cloud·django·php
Physicist in Geophy.4 小时前
b-value explain by first principle
开发语言·php
darkb1rd5 小时前
PHP核心特性与安全机制概述
安全·php
云游云记5 小时前
php性能优化总结
开发语言·性能优化·php
m0_748229995 小时前
Laravel高效入门:关键路径全解析
php·laravel