PHP 7.4.9 Released!

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 (değiştirgeler) => ifade

Ok işlevleri, üst etki alanındaki değişkenleri daima özdevinimli 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 özdevinimli olarak değişkenleri üst etki alanından daima değerleriyle alır

<?php

$y 
1;
 
$fn1 fn($x) => $x $y;
// $y değiştirgesini değeriyle kullanmaya eşdeğerdir:
$fn2 = function ($x) use ($y) {
    return 
$x $y;
};

var_export($fn1(3));
?>

Yukarıdaki örneğin çıktısı:

4

Aşağıdaki örnek, ok işlevleri iç içe kullanılsa da çalışır:

Örnek 2 - Ok işlevleri özdevinimli 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, değiştirge ve dönüş türleri dahil, öntanımlı değerler, değişken sayıda değiştirgeler, 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

?>

Sürüm Bilgisi

Sürüm: Açıklama
7.4.0 Ok işlevleri kullanılabilir oldu.

Notlar

Bilginize: Bir ok işlevi içinden func_num_args(), func_get_arg() ve func_get_args() kullanmak mümkündür.

add a note add a note

User Contributed Notes 2 notes

up
2
Koushil Mankali
10 days ago
In example 4  (Values from the outer scope cannot be modified by arrow functions)

<?php

$x
= 1;
$fn = fn() => $x++; // Has no effect
$fn();
var_export($x);  // Outputs 1

?>

Here we can use reference variable in fn(&$x) and pass the value from function call $fn($x) so that we will get the output as expected with out using Anonymous functions.

Example:

<?php

$x
= 1;
$fn = fn(&$x) => $x++;
$fn($x);
var_export($x);

?>

Output : 2 (as expected)

But here it will not take values from parent scope automatically but we have to pass them explicitly.
up
0
dexen dot devries at gmail dot com
3 days ago
Beware compact() not being able to access (import) variables from external scope (known in versions: 7.4.0, 7.4.8) (bug: https://bugs.php.net/bug.php?id=78970).

A workaround is available - use the variable directly; this will cause it to be imported into the arrow function's namespace and make it available to the compact() too.

<?php
$aa
= 111;
$accessing_variable_works = fn($bb) => [ $aa, $bb ];
$compact_is_broken = fn($bb) => compact('aa', 'bb');
$compact_can_work_with_workaround = fn($bb) => compact('aa', 'bb') + ['workaround' => $aa];
var_dump($accessing_variable_works(333));
var_dump($compact_is_broken(555));
var_dump($compact_can_work_with_workaround(777));
?>

result:
array(2) {
  [0]=>
  int(111)
  [1]=>
  int(333)
}
PHP Notice:  compact(): Undefined variable: aa in /home/m/vlt/guitar/tlb/s/public_html/index.php on line 9
array(1) {
  ["bb"]=>
  int(555)
}
array(3) {
  ["aa"]=>
  int(111)
  ["bb"]=>
  int(777)
  ["workaround"]=>
  int(111)
}
To Top