如何在PHP中使用箭头函数?
How to use arrow functions in PHP?
我开始了解 arrow functions in PHP 7.4。我尝试像
这样使用它们
<?php
$num = 1;
$arrowfunction = () => {
return $num + 1;
}
echo $arrowfunction();
因为我在拉取请求中看到了 =>
运算符。就像 javascript。
我希望输出“2”,但这没有用!我得到了
Parse error: syntax error, unexpected ')' in /test.php on line 3
PHP 中的箭头函数在 PHP 7.4 中引入。他们有点不同。
fn 关键字
新的 fn
关键字是 now a reserved keyword。
以前,我们继续使用 function
关键字。
$add = function ($valone,$valtwo) {
return $valone + $valtwo;
};
$add(1,2) // 3
随着新箭头函数的出现:
$add = fn($valone,$valtwo) => $valone + $valtwo;
$add(1,2) // 3
父范围
之前,我们必须遵循关键字 use
的用法,以便 涉及父作用域中的变量 。
$y = 1;
$fn = function ($x) use ($y) {
return $x + $y;
};
echo $fn(2); // 3
父作用域中定义的表达式将被隐式捕获by-value。
$y = 1;
$fn = fn($x) => $x + $y;
echo $fn(2); // 3
以上内容适用于 class 方法中的 $this
变量。
class foo {
public function test() {
$context = fn() => var_dump($this);
$context();
}
}
$test = new foo();
$test->test(); // object(foo)#1 (0) { }
就像以前一样,我们过去使用use
关键字从父作用域中获取变量来执行我们的操作,所以这意味着我们不能将变量的值从函数写入到上范围。
$y = 1;
$fn = fn() => $y++;
$fn(); // Has no effect
echo $y // 1
如果我们正在考虑从闭包中分配另一个变量的值,那么这也行不通
$y = 1;
$f = 0;
$fn = fn() => $f = $y + 1;
$fn();
echo $f; // 0
函数签名
这在 PHP 中是全新的,这允许我们定义函数的类型、变量和函数返回的值
fn(int $x) => $x; // the argument type must be (int)
fn(): int => $x; // type of return value (int)
调用函数时,如果未将定义的参数类型放入参数中,则会抛出错误。可以使用 TypeError
类型
捕获错误
$var = 10;
$int_fn = fn(int $x): int => $x;
var_dump($int_fn($var)); // int(10)
try {
$int_fn("foo");
} catch (TypeError $e) {
echo $e->getMessage(), "\n"; // Argument 1 passed to {closure}() must be of the type int, string given, called in x on line y
}
到 PHP 7.1,他们支持参数中的 ?type
,这也允许参数为 null。
$funn = fn(?int... $args): array => $args;
var_dump($funn(20, null, 30)); // Array(3) { [0]=> int(20) [1]=> NULL [2]=> int(30) }
如果您向上述函数提供字符串或其他任何内容而不是 int,则会出现错误
Argument passed to {closure}() must be of the type int or null, string given, called in x on line y
嵌套箭头函数
$var = 6;
var_dump((fn() => fn() => $var)()()); // int(6)
var_dump((fn() => function() use($var) { return $var; })()()); // int(6)
闭包内任何可能的错误都不会被抛出除非被调用
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$b = 1;
fn() => $b + $c; // no error, nothing
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$b = 1;
(fn() => $b + $c)(); // Notice: Undefined variable: c in the location on line x
如果错误报告关闭,那么您将得到 int(1)
如何使用PHP。 7.4 现在?
For quick online testing 只需将这些代码粘贴到那里
对于你的本地系统,我刚刚克隆了 this branch of php-src 并使用 GCC 和 make 编译了它。我通过 test.php 文件和命令行进行了测试,以检查是否一切正常。
在某些情况下,箭头函数可以使您的代码更短且更易读。它们的设计初衷是将它们用于简单的回调。例如考虑 usort()
,它接受一个回调函数作为用户参数。
在 PHP 7 之前,您必须像这样为 usort()
定义自己的回调:
// old syntax prior to PHP 7
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = [3, 2, 5, 6, 1];
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
PHP 7 添加了一个 ,现在多亏了箭头函数,你可以让你的代码更简洁。
// New syntax since PHP 7.4
$a = [3, 2, 5, 6, 1];
usort($a, fn($a, $b) => $a<=>$b);
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
在 3v4l.org
在线试用
PHP 中的匿名函数可能非常冗长,即使它们只执行一个简单的操作,因此语法更短的原因。作为另一个示例,请考虑以下函数:
// Returns an array with each element squared - old syntax
function array_square($arr) {
return array_map(function($x) { return $x*$x; }, $arr);
}
// Returns an array with each element squared - new syntax
function array_square($arr) {
return array_map(fn($x) => $x**2, $arr);
}
print_r(array_square([1,2,3,4,5]));
减少不必要的语法有助于理解代码的真正目的,但请记住,更短并不总是意味着更清晰!我建议像对待三元运算符一样谨慎对待箭头函数。只有当你知道它们有助于提高可读性时才使用它们,而不仅仅是为了让你的代码更短。
我开始了解 arrow functions in PHP 7.4。我尝试像
这样使用它们<?php
$num = 1;
$arrowfunction = () => {
return $num + 1;
}
echo $arrowfunction();
因为我在拉取请求中看到了 =>
运算符。就像 javascript。
我希望输出“2”,但这没有用!我得到了
Parse error: syntax error, unexpected ')' in /test.php on line 3
PHP 中的箭头函数在 PHP 7.4 中引入。他们有点不同。
fn 关键字
新的 fn
关键字是 now a reserved keyword。
以前,我们继续使用 function
关键字。
$add = function ($valone,$valtwo) {
return $valone + $valtwo;
};
$add(1,2) // 3
随着新箭头函数的出现:
$add = fn($valone,$valtwo) => $valone + $valtwo;
$add(1,2) // 3
父范围
之前,我们必须遵循关键字 use
的用法,以便 涉及父作用域中的变量 。
$y = 1;
$fn = function ($x) use ($y) {
return $x + $y;
};
echo $fn(2); // 3
父作用域中定义的表达式将被隐式捕获by-value。
$y = 1;
$fn = fn($x) => $x + $y;
echo $fn(2); // 3
以上内容适用于 class 方法中的 $this
变量。
class foo {
public function test() {
$context = fn() => var_dump($this);
$context();
}
}
$test = new foo();
$test->test(); // object(foo)#1 (0) { }
就像以前一样,我们过去使用use
关键字从父作用域中获取变量来执行我们的操作,所以这意味着我们不能将变量的值从函数写入到上范围。
$y = 1;
$fn = fn() => $y++;
$fn(); // Has no effect
echo $y // 1
如果我们正在考虑从闭包中分配另一个变量的值,那么这也行不通
$y = 1;
$f = 0;
$fn = fn() => $f = $y + 1;
$fn();
echo $f; // 0
函数签名
这在 PHP 中是全新的,这允许我们定义函数的类型、变量和函数返回的值
fn(int $x) => $x; // the argument type must be (int)
fn(): int => $x; // type of return value (int)
调用函数时,如果未将定义的参数类型放入参数中,则会抛出错误。可以使用 TypeError
类型
$var = 10;
$int_fn = fn(int $x): int => $x;
var_dump($int_fn($var)); // int(10)
try {
$int_fn("foo");
} catch (TypeError $e) {
echo $e->getMessage(), "\n"; // Argument 1 passed to {closure}() must be of the type int, string given, called in x on line y
}
到 PHP 7.1,他们支持参数中的 ?type
,这也允许参数为 null。
$funn = fn(?int... $args): array => $args;
var_dump($funn(20, null, 30)); // Array(3) { [0]=> int(20) [1]=> NULL [2]=> int(30) }
如果您向上述函数提供字符串或其他任何内容而不是 int,则会出现错误
Argument passed to {closure}() must be of the type int or null, string given, called in x on line y
嵌套箭头函数
$var = 6;
var_dump((fn() => fn() => $var)()()); // int(6)
var_dump((fn() => function() use($var) { return $var; })()()); // int(6)
闭包内任何可能的错误都不会被抛出除非被调用
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$b = 1;
fn() => $b + $c; // no error, nothing
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$b = 1;
(fn() => $b + $c)(); // Notice: Undefined variable: c in the location on line x
如果错误报告关闭,那么您将得到 int(1)
如何使用PHP。 7.4 现在?
For quick online testing 只需将这些代码粘贴到那里
对于你的本地系统,我刚刚克隆了 this branch of php-src 并使用 GCC 和 make 编译了它。我通过 test.php 文件和命令行进行了测试,以检查是否一切正常。
在某些情况下,箭头函数可以使您的代码更短且更易读。它们的设计初衷是将它们用于简单的回调。例如考虑 usort()
,它接受一个回调函数作为用户参数。
在 PHP 7 之前,您必须像这样为 usort()
定义自己的回调:
// old syntax prior to PHP 7
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = [3, 2, 5, 6, 1];
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
PHP 7 添加了一个
// New syntax since PHP 7.4
$a = [3, 2, 5, 6, 1];
usort($a, fn($a, $b) => $a<=>$b);
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
在 3v4l.org
在线试用PHP 中的匿名函数可能非常冗长,即使它们只执行一个简单的操作,因此语法更短的原因。作为另一个示例,请考虑以下函数:
// Returns an array with each element squared - old syntax
function array_square($arr) {
return array_map(function($x) { return $x*$x; }, $arr);
}
// Returns an array with each element squared - new syntax
function array_square($arr) {
return array_map(fn($x) => $x**2, $arr);
}
print_r(array_square([1,2,3,4,5]));
减少不必要的语法有助于理解代码的真正目的,但请记住,更短并不总是意味着更清晰!我建议像对待三元运算符一样谨慎对待箭头函数。只有当你知道它们有助于提高可读性时才使用它们,而不仅仅是为了让你的代码更短。