Menu

PHP Anonim Fonksiyonlar ve Closure: use Anahtar Kelimesi

Anonim fonksiyon (closure), bir değişkende saklanan adsız bir fonksiyondur: $greet = function ($name) { return "Hi $name"; };. use anahtar kelimesini, referansla yakalamayı, callable değerleri, strlen(...) birinci sınıf çağrılabilir söz dizimini ve sınıf içindeki closure'ları öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Closure olarak da adlandırılan anonim fonksiyon adı olmayan bir fonksiyondur. Bir değer beklenen yere function ($param) { ... } yazarsınız: bir değişkene atayın, başka bir fonksiyona verin ya da döndürün. Çevredeki koddan değişkenleri use ($var) ile taşıyabilir.

Her anonim fonksiyon yerleşik Closure sınıfının bir nesnesidir; saklanabilmesinin, aktarılabilmesinin ve daha sonra $greet(...) ile çağrılabilmesinin nedeni budur.

use anahtar kelimesi değerle yakalar

Bir closure dışarıdaki değişkenleri kendi başına göremez. use ($x) $x değerini closure çalıştığında değil, oluşturulduğu anda closure içine kopyalar:

Referansla use: &$var

use (&$x) closure'a kopya yerine değişkenin kendisini verir. Closure içindeki değişiklikler dışarıda görünür, dışarıdaki değişiklikler de içeride görülür. Bir geri çağırma bir toplama ekleme yapar veya bir sayaç tutarken böyle çalışır.

Her makeCounter() çağrısı yeni bir $count oluşturur ve döndürülen closure fonksiyon döndükten sonra da onu yaşatır. "Closure" (kapanış) kelimesinin anlatmak istediği budur: fonksiyon ihtiyaç duyduğu değişkenleri kapsar.

Bir closure'ı geri çağırma olarak verme

array_map(), array_filter(), usort() ve array_walk() gibi fonksiyonlar argüman olarak bir fonksiyon alır. Bir closure onu, işin gerektirdiği kadar deyimle yerinde yazmanızı sağlar:

Gövde tek bir ifade olduğunda fn($p) => $p['price'] gibi bir ok fonksiyonu daha kısadır ve use gerektirmez.

Callable değerler: fonksiyon adları, metotlar ve strlen(...)

callable türünde bir parametre closure'lardan fazlasını kabul eder. Fonksiyon adı içeren bir dizge, bir nesne ve metot adı içeren bir dizi, bir sınıf adı ve statik metot adı içeren bir dizi de sayılır. PHP 8.1'den beri strlen(...) birinci sınıf çağrılabilir söz dizimi bunların herhangi birini doğrudan bir Closure nesnesine çevirir.

(...) biçimi satır çalıştığında kontrol edilir: bir yazım hatası orada hemen bir Error fırlatır. 'strtoupr' gibi bir dizge, biri onu çağırmaya çalışana kadar yalnızca bir dizgedir.

Bir sınıf içindeki closure'lar: $this ve static

Bir metot içinde oluşturulan bir closure'a $this otomatik olarak bağlanır, böylece nesnenin özelliklerini kullanabilir. $this gerekmediğinde onu static function olarak işaretleyin; bu ayrıca nesneyi gereksiz yere yaşatmasını da önler.

use yazmayı unutmak

En yaygın closure hatası, dışarıdaki bir değişkeni use içinde listelemeden kullanmaktır. Closure içinde değişken yoktur:

$minAge = 18;
$adults = array_filter($people, function ($p) {
    return $p['age'] >= $minAge;   // $minAge is not in use (...)
});
PHP prints: Warning: Undefined variable $minAge

$minAge içeride null olur, >= null ile karşılaştırılan her yaş true olur ve herkes filtreden geçer. Uyarıları gizleyen bir sunucuda size hiçbir şey bunu söylemez. Değişkeni use içine ekleyin:

Sıkça Sorulan Sorular

PHP'de closure nedir?

function (...) { ... } ile oluşturulan ve bir değişkende saklanan ya da argüman olarak verilen adsız bir fonksiyondur. PHP onu Closure sınıfının bir nesnesi olarak temsil eder. Oluşturulduğu kapsamdan use (...) içinde listelenen değişkenleri taşıyabilir.

PHP closure içinde use anahtar kelimesi ne işe yarar?

use ($x) dışarıdaki $x değişkenini closure oluşturulduğunda closure içine kopyalar. $x üzerinde dışarıda yapılan sonraki değişiklikler görülmez. Bunun yerine değişkeni paylaşmak için use (&$x) yazın, böylece değişiklikler iki yönde de geçer.

PHP'de callable nedir?

PHP'nin çağırabileceği her şey: bir closure, dizge olarak bir fonksiyon adı ('strtoupper'), bir [$object, 'method'] veya [ClassName::class, 'staticMethod'] dizisi ya da __invoke() içeren bir nesne. Bunlardan herhangi birini kabul etmek için callable türünü, kontrol etmek için is_callable() kullanın.

PHP'de strlen(...) ne anlama gelir?

PHP 8.1'deki birinci sınıf çağrılabilir söz dizimidir: strlen(...) fonksiyonu çağırmadan ondan bir Closure oluşturur. Metotlar $obj->method(...) ve statik metotlar Foo::bar(...) için de çalışır ve dizge adın aksine satır çalıştığında kontrol edilir.

Bir anonim fonksiyondan sonra noktalı virgül gerekir mi?

Evet, onu atadığınızda: $f = function () { ... }; bir atama deyimidir, bu yüzden ; ile biter. Onu unutmak bir ayrıştırma hatasıdır. Doğrudan argüman olarak verilen bir closure kendi noktalı virgülünü gerektirmez.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA