PHP语法基础篇(七):函数

发布于:2025-07-02 ⋅ 阅读:(12) ⋅ 点赞:(0)
PHP 拥有超过 1000 个内置函数,此外,还可以创建自己的自定义函数。
  • 函数是程序中可以重复使用的一组语句块。
  • 页面加载时,函数不会自动执行。
  • 函数将通过调用函数来执行。
本篇文章将记录自定义函数的学习过程。PHP 内置函数可以查询官方文档: PHP函数参考

一、用户自定义函数

用户定义的函数声明以关键字 function 开头,后跟函数名。函数名必须以字母或下划线开头。函数名不区分大小写。

示例 展示函数用途的伪代码

function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
    // 函数代码段
    return $retval;
}

PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。

给函数起一个反映函数功能的名称。


二、调用函数 

调用函数,只需写函数名,后跟一对括号 ()

function myFunction() {
    echo "Hello World!";
}

myFunction(); // 输出 "Hello World!"

左大括号 { 表示函数代码的开始,右大括号 } 表示函数代码的结束。


三、函数的参数

通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。函数在实际调用之前,值参数是从左向右求值的。

PHP 支持按值传递参数(默认),通过引用传递参数 以及 默认参数。也支持 可变长度参数列表 和 命名参数。

下例有一个带有一个参数 ($name) 的函数。当调用 hello() 函数时,我们需要传递一个名称,然后在函数内部使用该名称,该函数输出几个不同的名称:

function hello($name) {
    echo "Hello: " . $name . "<br>";
}

hello("张三");
hello("李四");
hello("王五");

当然,函数中参数的数量可以有多个。

1、通过引用传递参数

默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。

如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &

function addNum(&$num) {
    $num += 5;
}

$num = 5;
addNum($num);
echo $num; // 输出 "10"

 2、默认参数值

函数可以使用类似分配变量的语法定义参数的默认值。仅当参数未指定时才使用默认值;需要注意的是传递 null 不会分配默认值。

function hello($name = "未命名") {
    echo "Hello: " . $name . "<br>";
}

hello();
hello("张三");
hello(null);

输出

Hello: 未命名
Hello: 张三
Hello:

默认参数值可以是标量值、array、特殊类型 null,以及从 PHP 8.1.0 开始,使用 new ClassName() 语法的对象。

注意任何可选参数都应在强制参数之后指定,否则可选参数不能在调用时省略。

3、可变长度参数 

通过在函数参数前使用 ... 运算符,函数可以接受未知数量的参数。这也称为可变参数函数。可变参数函数的参数会成为数组。

function sum(...$nums) {
    $result = 0;
    foreach ($nums as $num) {
        $result += $num;
    }

    return $result;
}

echo sum(1, 2, 3, 4); // 输出 "10"

可以在 ... 前指定正常的位置参数。在这种情况下,只有不符合位置参数的尾部参数才会被添加到 ... 生成的数组中。

注意只能有一个可变长度参数,并且它必须是最后一个参数。

也可以使用 ... 语法来传递 array 做为参数到函数中:

function add($a, $b) {
    return $a + $b;
}

echo add(...[1, 2]); // 输出3

 4、命名参数

PHP 8.0.0 开始引入了命名参数作为现有位置参数的扩展。命名参数允许根据参数名而不是参数位置向函数传参。这使得参数的含义自成体系,参数与顺序无关,并允许任意跳过默认值。

命名参数通过在参数名前加上冒号来传递。允许使用保留关键字作为参数名。参数名必须是一个标识符,不允许动态指定。

function myFunciton($brand, $price) {
    echo $brand . ":" . $price . "<br>";
}

// 使用顺序传递参数
myFunciton("华为", 1999);

// 使用命名参数
myFunciton(price: 999, brand: "红米");

从上面的示例中可以看到,指定参数的传递顺序并不重要。

命名参数也可以与位置参数相结合使用。这种情况下,命名参数必须在位置参数之后。

function myFunciton($brand, $price, $color) {
    echo $brand . ":" . $price . "," . $color . "<br>";
}

myFunciton("华为", color: "红色", price: 1999);

四、返回值

值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。

要让函数返回一个值,需使用 return 语句:

如果省略了 return 语句,则返回值为 null

function square($num)
{
    return $num * $num;
}
echo square(4);   // 输出 "16"

 函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。


五、能否指定函数参数和返回值的数据类型?

在上面的示例中,我们不需要告诉 PHP 变量是什么数据类型。PHP 会根据变量的值自动为其关联数据类型。由于数据类型不是严格设置的,因此可以执行诸如将字符串添加到整数之类的操作而不会引发错误。但这并不是我们想要的,我们想要传入自定义函数中的数据类型是 int,但是传入了 string,这样就会导致结果错误,原因就是没有数据类型检查。那么,这个问题能否解决呢?

好消息是,在 PHP 7 中,添加了类型声明。这给了我们一个选项,可以在声明函数时指定预期的数据类型,并通过添加严格声明,在数据类型不匹配时抛出“致命错误”。

要指定严格声明,需要设置 declare(strict_types=1);。这必须在 PHP 文件的第一行。

<?php declare(strict_types=1); // 严格声明

function add(int $a, int $b) {
  return $a + $b;
}
echo add(5, "5 days");
// 由于启用了严格声明,"5 days" 不是整数,将引发错误
?>

输出

严格声明强制按预期方式来使用参数。

同样的,PHP 7 还支持 return 语句的类型声明。与函数参数的类型声明一样,通过启用严格声明,在类型不匹配时将抛出“致命错误”。

在函数声明中声明返回类型,需要在声明函数时在左大括号 ( { ) 之前添加冒号 ( : ) 和类型。

 

<?php declare(strict_types=1); // 严格声明

function add(int $a, int $b) : int {
  return $a + $b;
}
echo add(5, 5);
?>

网站公告

今日签到

点亮在社区的每一天
去签到