화살표 함수라고도 불리는 짧은 클로저는 PHP로 작성된 짧은 함수입니다. 이 기능은 array_map
또는 array_filter
함수를 사용할 때와 같이 함수에 클로저를 전달할 때 매우 유용합니다. array_map
或是 array_filter
函数时.
这就是它们看起来的样子:
// Post 对象的集合 $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts); 而以前,你必须这样写: $ids = array_map(function ($post) { return $post->id; }, $posts);
我们来总结一下短闭包函数如何使用.
在 PHP 7.4 里可用
以 fn 关键字开头
只能包含 一个 表达式,即返回表达式
return 关键字可忽略
参数和返回类型均可做类型暗示
上面示例更严格的类型限定写法可写作:
$ids = array_map(fn(Post $post): int => $post->id, $posts);
有两点需要提及:
还允许使用扩展操作符
允许引用,两个参数都可以作为返回值
假如你想要通过引用的方式返回结果,应该使用以下语法:
fn&($x) => $x
简而言之,除了只允许一个表达式以外,简短的闭包和普通闭包的功能是一样的。
单行
你应该正确的理解它:短闭包只能有一个表达式。这意味着闭包体中不能有多行。
原因如下:短闭包的目的是为了减少冗余。当然,在任何情况下, fn
都比 function
短。然而, RFC 的创建者 Nikita Popov 认为,如果你要处理的是多行表达式的函数,那么使用闭包获得的益处就更少了。
毕竟,多行闭包的定义已经很冗余了,所以,有和没有这 2 个关键字( function
和 return
)将不会有太大区别。
你是否同意这个观点取决于你自己。虽然我可以在我的项目中想到很多单行闭包的场景,但也有很多多行闭包的情况,从个人角度,我会喜欢这些情况下的简短语法。
不过还是有希望的:未来可能会添加多行短闭包,但那也是一个单独的 RFC 。
外部作用域的值
短闭包和普通闭包的另一个显著特征是,短闭包不需要用 use 关键字就能访问外部作用域的数据。
$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);
需要注意的是,不能修改外部范围中的变量。因为它属于值传递而不是引用传递。这意味着你可以改变短闭包内的 $modifier
变量,但它不会对外部作用域中的 $modifier
变量产生影响。
当然,有一个例外,那就是 $this
关键字,它的作用与普通闭包中的作用完全相同:
array_map(fn($x) => $x * $this->modifier, $numbers);
发展前景
我已经提到过的多行闭包仍然是将来的一个发展可能。另外一个在我脑海中的想法就是在允许在类中使用短闭包,比如 getters
和 setters
class Post { private $title; fn getTitle() => $this->title; }방법을 요약해 보겠습니다. 짧은 폐쇄 기능을 사용합니다.🎜
- 🎜PHP 7.4에서 사용 가능🎜
- 🎜fn 키 사용 단어의 시작 🎜 li>
- 🎜 하나의 표현식만 포함할 수 있습니다. 즉, 반환 표현식 🎜
- 🎜return 키워드는 무시할 수 있습니다.🎜
- 🎜매개변수와 반환 유형 모두 유형 힌트를 사용할 수 있습니다. made 🎜
- 🎜확산 연산자 사용도 허용🎜
- 🎜참조를 허용하며 두 매개변수 모두 반환 값으로 사용할 수 있습니다🎜
fn
은 어떤 경우에도 function
보다 짧습니다. 그러나 RFC 작성자 Nikita Popov는 여러 줄로 구성된 표현식을 다루는 경우 클로저를 사용하면 얻을 수 있는 이점이 훨씬 적다고 믿습니다. 🎜🎜결국 여러 줄 클로저의 정의는 이미 매우 중복되므로 이 두 키워드( function
및 return
)가 있거나 없거나 큰 차이는 없습니다. 큰 차이 . 🎜🎜이 관점에 동의할지 여부는 귀하에게 달려 있습니다. 내 프로젝트에서 한 줄 클로저에 대한 많은 시나리오를 생각할 수 있지만 여러 줄 클로저에 대한 시나리오도 많이 있으며 개인적으로 저는 그러한 경우에 대해 더 짧은 구문을 선호합니다. 🎜🎜희망은 있습니다. 여러 줄의 짧은 클로저가 향후 추가될 수 있지만 이는 별도의 RFC이기도 합니다. 🎜🎜외부 범위의 값🎜🎜짧은 클로저와 일반 클로저의 또 다른 주목할만한 특징은 짧은 클로저가 use 키워드를 사용하지 않고도 외부 범위의 데이터에 액세스할 수 있다는 것입니다. 🎜rrreee🎜외부 범위의 변수는 수정할 수 없다는 점에 유의하세요. 참조로 전달하는 것이 아니라 값으로 전달하기 때문입니다. 이는 짧은 클로저 내부의 $modifier
변수를 변경할 수 있지만 외부 범위의 $modifier
변수에는 영향을 미치지 않음을 의미합니다. 🎜🎜물론 예외가 있습니다. 바로 $this
키워드로 일반 클로저와 정확히 동일하게 작동합니다. 🎜rrreee🎜🎜 🎜개발 전망🎜🎜이미 언급한 다중 라인 클로저는 여전히 미래의 개발 가능성입니다. 내 생각에 있는 또 다른 아이디어는
getters
및 setters
함수와 같은 짧은 클로저를 클래스에서 사용하도록 허용하는 것입니다. 🎜rrreee🎜 전체적으로 짧은 클로저는 훌륭한 A입니다. 환영 기능이지만 개선의 여지가 많습니다. 가장 가능성이 높은 것은 다중 라인 폐쇄입니다.🎜위 내용은 PHP 7.4 화살표 함수 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Dreamweaver Mac版
시각적 웹 개발 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
