函数是编程中最重要的概念之一。
你可以用函数将多条指令、多行代码组合在一起,并给它们一个名字。
例如,你可以制作一个发送电子邮件的函数。例如,我们把它叫做sendEmail ,我们这样定义它:
function sendEmail() {
//send an email
}
并且你可以通过使用这种语法在其他地方调用它:
sendEmail();
你可以向一个函数传递参数,例如,当你发送电子邮件时,你想把它发送给某人,所以你把电子邮件作为第一个参数:
sendEmail('test@test.com');
在函数定义中,我们以这种方式获得这个参数(我们在函数定义中称它们为参数,而在调用函数时称它们为参数):
function sendEmail($to) {
echo "send an email to $to";
}
你可以通过用逗号分隔来发送多个参数:
sendEmail('test@test.com', 'subject', 'body of the email');
而且我们可以按照定义的顺序获得这些参数:
function sendEmail($to, $subject, $body) {
//...
}
我们可以选择性地设置参数的类型:
function sendEmail(string $to, string $subject, string $body) {
//...
}
参数可以有一个默认值,所以如果它们被省略了,我们仍然可以有一个参数的值:
function sendEmail($to, $subject = 'test', $body = 'test') {
//...
}
sendEmail('test@test.com')
一个函数可以返回一个值。一个函数只能返回一个值,不能多于一个。你可以用return 关键字来做到这一点。如果省略,函数返回null 。
返回值是超级有用的,可以知道在函数中完成的工作的结果,或者在调用函数后使用其结果:
function sendEmail($to) {
return true;
}
$success = sendEmail('test@test.com');
if ($success) {
echo 'email sent successfully';
} else {
echo 'error sending the email';
}
我们可以用这种语法选择性地设置函数的返回类型:
function sendEmail($to): bool {
return true;
}
当你在一个函数中定义一个变量时,该变量是函数的局部变量,这意味着它在外面是不可见的。当函数结束时,它只是停止存在:
function sendEmail($to) {
$test = 'a';
}
var_dump($test); //PHP Warning: Undefined variable $test
在函数外定义的变量在函数内是无法访问的。
这执行了一个良好的编程实践,因为我们可以确保函数不会修改外部变量并引起 "副作用"。
相反,你从函数中返回一个值,而调用该函数的外部代码将负责更新外部变量。
像这样:
$character = 'a';
function test() {
return 'b';
}
$character = test();
你可以把一个变量的值作为参数传递给函数:
$character = 'a';
function test($c) {
echo $c;
}
test($character);
但你不能从函数内部修改这个值。
它是通过值传递的,这意味着函数收到的是它的副本,而不是对原始变量的引用。
使用这种语法仍然可以做到这一点(注意我在参数定义中使用了& ):
$character = 'a';
function test(&$c) {
$c = 'b';
}
test($character);
echo $character; //'b'
到目前为止,我们定义的函数是命名函数。
它们有一个名字。
我们还有匿名函数,它在很多情况下都很有用。
它们本身没有名字,但它们被分配给一个变量。要调用它们,你要在最后用括号调用该变量:
$myfunction = function() {
//do something here
};
$myfunction()
请注意,你需要在函数定义后面加上一个分号,但它们的工作方式与命名函数的返回值和参数一样。
有趣的是,它们提供了一种方法,可以通过use() ,访问定义在函数之外的变量:
$test = 'test';
$myfunction = function() use ($test) {
echo $test;
return 'ok';
};
$myfunction()
另一种函数是箭头函数。
箭头函数是一个匿名函数,只有一个表达式(一行),并隐含地返回该表达式的值
你以这种方式定义它:
fn (arguments) => expression;
这里有一个例子:
$printTest = fn() => 'test';
$printTest(); //'test'
你可以向箭头函数传递参数:
$multiply = fn($a, $b) => $a * $b;
$multiply(2, 4) //8
请注意,正如下一个例子所示,箭头函数可以自动访问包围范围内的变量,而不需要use() :
$a = 2;
$b = 4;
$multiply = fn() => $a * $b;
$multiply()
当你需要传递一个回调函数时,箭头函数是超级有用的。我们将在后面看到如何使用它们来执行一些数组操作。
所以我们总共有3种函数:命名函数、匿名函数和箭头函数。
每一种都有它的位置,随着时间的推移和实践的进行,你会学会如何正确使用它们。