PHP 8.5 ile birlikte gelen pipe operatörü, öncelikle single-input dönüşümler için oldukça faydalıdır. Örneğin, bir stringin manipülasyonu için kullanmak oldukça mantıklıdır:
$slug = $title
|> trim(...)
|> strtolower(...);
Pipe operatörü, PHP’deki array stdlib üzerinde kullanılmaya çalışıldığında sorunlar çıkarmaya başlar; çünkü bu, genelde hata ve tutarsızlıklarla doludur. Pipe operatörünün en iyi şekilde kullanılacağı yer, düzgün bir veri akışı sağlayan fonksiyonlar için, örneğin unary stdlib fonksiyonlarıdır.
Naif Port
Naif Port
Aşağıda, kullanıcıdan alınan etiketlerin temizlenip A’dan Z’ye sıralandığı yaygın bir form işleme örneği verilmiştir:
$cleanTags = array_values(
array_filter(
array_map(fn($t) => strtolower(trim($t)), $rawTags),
fn($t) => strlen($t) >= 3
)
);
sort($cleanTags);
Üç iç içe çağrı var ve ardından bir sort işlemi gerçekleştiriliyor. Bu yapıda, sort fonksiyonu bir boolean döndürmekle kalmaz, dizinin referansa göre mutasyona uğramasına neden olur. Pipe operatörü bu durumu şu şekilde sadeleştirir:
$cleanTags = $rawTags
|> (fn($ts) => array_map(fn($t) => strtolower(trim($t)), $ts))
|> (fn($ts) => array_filter($ts, fn($t) => strlen($t) >= 3))
|> array_values(...)
|> (function ($ts) { sort($ts); return $ts; });
Bu kod, daha önceki iç içe versiyondan daha düzenli bir görünüm sunuyor. Ancak, pipe operatörü bazı durumlarda karmaşıklık yaratabiliyor.
Gotcha 1: Argüman Sırası Uyuşmazlığı
Gotcha 1: Argüman Sırası Uyuşmazlığı
array_map ve array_filter argümanlarını farklı sıralarda alıyorlar:
array_map(callable $callback, array $array, ...); // callable önce
array_filter(array $array, ?callable $callback, ...); // array önce
Pipe operatörü, soldaki değeri sağdaki herhangi bir fonksiyonun birinci argümanı olarak geçirir. Bu, iş akışında sıraların karışacağı anlamına gelir. Örneğin, array_filter‘de bu durum işliyor, fakat array_map‘da bozulmalarla karşılaşılabilir.
Gotcha 2: Ok Fonksiyonları Parantez Gerektirir
Gotcha 2: Ok Fonksiyonları Parantez Gerektirir
Yazımda dikkat edilmesi gereken, ok fonksiyonlarının parantez içine alınması gerektiğidir:
|> (fn($ts) => array_map(fn($t) => strtolower(trim($t)), $ts))
Parantez yoksa, ok fonksiyonu ifadeyi sonuna kadar “kapsayabilir”. Bu da yanlış bir işlem akışı oluşturur. Bu nedenledir ki ok fonksiyonları, pipe zinciri içerisinde her zaman parantez içinde kullanılmalıdır.
Gotcha 3: Referans ile Çalışan Fonksiyonlar Bileşemez
Gotcha 3: Referans ile Çalışan Fonksiyonlar Bileşemez
Bunun nedeni, hem sort hem de array_walk gibi fonksiyonların birinci parametrelerinin referans almasıdır:
$rawTags |> sort(...); // hata: by-ref param
$rawTags |> array_walk(...); // aynı
$stack |> array_pop(...); // aynı
Bu fonksiyonlar, pipe ile kullanıldığında yapılandırmada zorluklar çıkarır. Çözüm olarak, çıktıyı diziye döndürüp dışarıda işlemekte fayda var.
Pipe Operatörünün Gerçek Şansı
Pipe Operatörünün Gerçek Şansı
Unary stdlib fonksiyonları için pipe operatörü ideal bir yapı sunar:
$slug = $title
|> trim(...)
|> strtolower(...)
|> (fn($s) => preg_replace('/[^a-z0-9]+/', '-', $s));
Özellikle string normalizasyonu, encode/decode pipeline’ları gibi alanlarda kullanışlıdır.
Sonuç
Sonuç
PHP 8.5’teki pipe operatörü belirgin bir iyileşme sunuyor. Eğer kodunuz sırasında çokça dizi işlemi yapıyorsanız, bir Collection kütüphanesi kullanmak daha temiz ve okunaklı bir çözüm sunmaktadır.
Kaynak: Orijinal Makale


