<?php练功房

第 3 章 · 函数 · 第 3.2 课

作用域与匿名函数

约 15 分钟

函数有自己的作用域

函数内部是一个独立的世界:看不到函数外面的变量,函数里新建的变量在函数结束后也会消失。需要外面的数据,就通过参数传进去。

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