箭头函数是PHP7.4中引入的一种新的短匿名函数的语法。
匿名函数,如果你不熟悉的话,是写在代码的其他部分的特殊函数,可以像变量一样传递。
通常这些函数都很短,而且是有目的的。它们不应该包含大量的逻辑。
箭头函数的突出之处在于,它允许你编写简明的单操作匿名函数,就像你在做排序或map/reduce操作时可能会用到的。
=> 使用实例
假设你想从你的船的库存中列出一个名字。
$ships = [
'Ship1' => ['name' => 'Rocinante'],
'Ship2' => ['name' => 'Razorback'],
];
在PHP中做这个的传统方法是一个foreach 循环。
$names = array();
foreach ($ships as $key => $value) {
$names[] = $value['name'];
}
根据你的需要,你可能会选择将其优化为一个array_map ,对数组应用一个可调用的函数并返回转换后的数组。
$names = array_map(
function ($item) {
return $item['name'];
},
$ships
);
这看起来并不是很大的节省,但在一些算法中,它使事情变得更干净,更容易操作。
在PHP7.4中,这可以这样写。
$names = array_map(fn($ship) => $ship['name'], $ships);
这比之前的两个例子都要短得多。一旦我们掌握了阅读新语法的技巧,可能也会感觉更自然。
=> 范围内
与原来的匿名函数语法相比,这种语法的一个好处是它处理范围的新方法。
在原来的方法中,你必须通过写function ($param1) use ($var1, $var2) {...} 来特别包括你想访问的变量。
在短函数语法中,这就太啰嗦了,所以外部范围会自动为你导入。
$numbers = [1, 2, 3, 4, 5];
$multipier = 10;
$product = array_map(fn($item) => $item * $multipier, $numbers);
// $product: [10, 20, 30, 40, 50];
=> 等一下,Hoss
关于 "外层作用域 "的一个重要说明,直接来自PHP.net 的文档。外围范围的值不能被箭头函数修改。它们是按值传递的,不是按引用传递的。对它们的修改会触发内存中的拷贝,而不是覆盖外层变量。我想,由于对象的实例化性质,可能会有一些能力来绕过这一点。
最终,这意味着,如果你希望做一些诡异的事情,比如把值推到数组上,或者从你的箭头函数中递增计数器,这对你的算法来说是不可能的。
=> 如果我需要更多的力量呢?
箭头函数被设计用于非常特殊的用例,其中内部逻辑极其简短。如果你发现你需要更多的功能,你可能需要看看常规的匿名函数,或类/对象方法可调用,或常规的非类函数。正如他们所说,海里有很多PHP的选择。