Ok İşlevleri
Ok işlevleri PHP 7.4'te anonim
işlevler için daha kısa bir sözdizimi olarak tanıtılmıştır.
Anonim işlevler ve ok işlevlerinin ikisi de
Closure
sınıfı kullanılarak gerçeklenmiştir.
Ok işlevlerinin temel biçimi:
fn (bağımsız değişkenler) => ifade
Ok işlevleri, üst etki alanındaki değişkenleri daima otomatik
kullanması dışında anonim
işlevlerin desteklediği özelliklerin tümünü destekler.
İfadede kullanılan bir değişken üst etki alanında tanımlandığında,
örtük olarak değeriyle aktarılır. Aşağıdaki örnekte
$fn1 ve $fn2 işlevleri aynı
şekilde davranır.
Örnek 1 - Ok işlevleri otomatik olarak değişkenleri üst etki alanından
daima değerleriyle alır
<?php
$y = 1;
$fn1 = fn($x) => $x + $y;
// $y bağımsız değişkenini değeriyle kullanmaya eşdeğerdir:
$fn2 = function ($x) use ($y) {
return $x + $y;
};
var_export($fn1(3));
?>
Yukarıdaki örneğin çıktısı:
Aşağıdaki örnek, ok işlevleri iç içe kullanılsa da çalışır:
Örnek 2 - Ok işlevleri otomatik olarak değişkenleri iç içe olsalar bile
üst etki alanından daima değerleriyle alır
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// 51 çıktılanır
var_export($fn(5)(10));
?>
Anonim işlevlere benzer olarak, ok işlevleri sözdizimi de, bağımsız değişken ve
dönüş türleri dahil, öntanımlı değerler, değişken sayıda bağımsız değişkenler,
gönderimli aktarım ve dönüşler gibi rasgele işlev imzalarına da izin
verir. Aşağıdaki ok işlevlerinin tamamı geçerli örneklerdir:
Örnek 3 - Ok işlevi örnekleri
<?php
fn(array $x) => $x;
static fn(): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;
?>
Ok işlevleri değişken bağlamını değeriyle kullanır. Bu kabaca, ok işlevi
içinde kullanılan her $x değişkeni için bir
use($x)
çalıştırmaya eşdeğerdir.
Değişken bağlamını değeriyle kullanmaktan kasıt, dış etki alanındaki
herhangi bir değerin değiştirilmesinin mümkün olmayacağıdır.
Değişken bağlamını gönderimiyle kullanmak için
anonim işlevler
kullanılabilir.
Örnek 4 - Dış etki alanındaki değerler ok işlevleri kullanılarak
değiştirilemez
<?php
$x = 1;
$fn = fn() => $x++; // Etkisiz
$fn();
var_export($x); // 1 çıktılanır
?>