第 3 章 · 函数 · 第 3.2 课
作用域与匿名函数
函数有自己的作用域
函数内部是一个独立的世界:看不到函数外面的变量,函数里新建的变量在函数结束后也会消失。需要外面的数据,就通过参数传进去。
static 变量
普通局部变量每次调用都会重新开始。加上 static,变量会在多次调用之间保留它的值。
匿名函数和闭包
函数也可以没有名字,直接存进变量,这叫匿名函数。想用外面的变量,要用 use ($变量) 显式“带进来”,这样的函数叫闭包。
use ($rate) 带进来的是一份拷贝;如果想在函数里修改外面的变量,要写 use (&$rate)(加 & 表示引用)。
箭头函数 fn($x) => 表达式 是更短的写法:只能有一个表达式,会自动捕获外面的变量(按值)。
函数当参数,函数当返回值
参数类型写 callable,就能接收一个函数。函数也可以返回另一个函数,下面的 multiplier(3) 造出了一个“乘以 3”的函数。
选择题
下面代码输出什么?
<?php
$x = 1;
$f = function () use ($x) {
return $x;
};
$x = 2;
echo $f();
练习 1
计数器工厂
已通过写函数 makeCounter(),返回一个闭包。每调用一次闭包,就返回一个递增的数:1、2、3……
不同的计数器互不影响:
$a = makeCounter();
$b = makeCounter();
$a(); $a();
echo $a(), $b(); // 输出 31练习 2
名字首字母大写
已通过用 array_map 加一个箭头函数,把 $names 里的每个名字变成首字母大写,然后用 & 连起来输出:
Tom & Amy & Jack