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);
?>