PHP学习笔记8:函数
图源:php.net
定义
php的函数可以定义在任何地方,甚至是条件语句中:
function create_func(int $num){
if ($num<10){
function test(){
echo "test function is called".PHP_EOL;
echo "the \$num < 10";
}
}
else{
function test(){
echo "test function is called".PHP_EOL;
echo "the \$num >= 10";
}
}
}
create_func(10);
test();
// test function is called
// the $num >= 10
这个示例代码中create_func
函数会根据传入参数的不同定义两个不同的函数,虽然这两个函数名称相同。
需要注意的是,php中函数一旦定义,其在全局作用域中都会生效,即可以在任何地方调用这个函数。
此外,在php中,是不能重复定义同名函数的,所以再次调用create_func
函数会产生一个错误:
create_func(10);
// Fatal error: Cannot redeclare test() (previously declared in ...
参数
php8.0.0之后,函数的参数列表中,最后一个参数之后可以使用一个额外的,
,这样做有助于编写长参数列表的函数:
function multi_params(
$param1,
$param2,
$param3,
) {
; //do something
}
引用传递
默认情况下,函数传参都是值传递:
<?php
function double_num(int $num)
{
$num = $num * 2;
}
$a = 2;
double_num($a);
echo $a . PHP_EOL;
// 2
要修改值需要使用引用传递参数:
<?php
function double_num(int &$num)
{
$num = $num * 2;
}
$a = 2;
double_num($a);
echo $a . PHP_EOL;
// 4
当然,传递对象时是引用传递,这点依然不会改变:
<?php
class Student
{
public $name = "";
public $age = 0;
}
$std = new Student;
function change_student_name(Student $std, string $name)
{
$std->name = $name;
}
change_student_name($std, "Jack Chen");
echo "{
$std->name}" . PHP_EOL;
// Jack Chen
默认值
可以给参数指定默认值,默认值可以是常量、基础类型、数组、null等,但不能是变量或者函数调用:
function default_params($param1 = 1, $param2 = 2)
{
; //do something
}
default_params();
引用类型的参数也可以指定默认值:
<?php
class Student{
}
function default_params(?Student $student = null){
;//do something
}
default_params();
使用参数默认值的时候需要注意,要将有默认值的参数放在参数列表的尾部:
function add_two_str(string $str1, string