PHP 8.5 pipe operator, |>, bir ifadenin sonucunu sonraki çağrıya aktarmak için kullanılır. Amaç, dönüşüm adımlarını iç içe fonksiyon çağrıları yerine soldan sağa takip edilebilen bir akış hâlinde yazabilmektir.
Bu yaklaşım her kod yapısında daha iyi bir seçenek değildir. Okunabilirlik, işlemlerin sırasına, her adımın ne yaptığına ve zincirde kullanılan çağrıların açıklığına bağlıdır.
PHP 8.5 pipe operator ne işe yarar?
PHP 8.5 ile gelen |> operatörü, solundaki değeri sağındaki çağrılabilir yapıya aktarır ve o çağrının sonucunu üretir. Böylece bir metni temizleme, biçim dönüştürme veya farklı işlemlerden geçirme gibi ardışık süreçlerde ara değişken tanımlama ihtiyacı azalabilir. PHP’nin resmî duyurusunda da bu özellik, iç içe çağrıları ileri yönde okunabilen zincirlere dönüştürmenin bir yolu olarak açıklanır.
Operatörün temel amacı, verinin hangi sırayla işlendiğini görünür kılmaktır. Örneğin aşağıdaki kodda başlıktaki boşluklar temizlenir, metin küçük harfe çevrilir, boşluklar kısa çizgi olur ve bazı karakterler kaldırılır:
<?php
$rawTitle = " PHP 8.5 | Pipe Operator! ";
$slug = $rawTitle
|> trim(...)
|> strtolower(...)
|> (fn(string $value): string => str_replace(' ', '-', $value))
|> (fn(string $value): string => str_replace(['|', '!'], '', $value));
echo $slug;
Beklenen çıktı şöyledir:
php-8.5-pipe-operator
Burada trim(...) ve strtolower(...), fonksiyonları çağrılabilir değer olarak ileten first-class callable söz dizimini kullanır. Ek parametre gerektiren str_replace() işlemleri ise önceki sonucu alan bir arrow function içine yazılmıştır. Bu ayrım önemlidir: Pipe operator, soldaki değeri sağdaki çağrıya tek argüman olarak verir; diğer argümanları kendiliğinden tamamlamaz.
Bu yapı özellikle birbirini izleyen dönüşümlerde anlaşılır olabilir. Buna karşılık tek bir işlem, karmaşık koşullar veya yan etkisi bulunan çağrılar için pipe zinciri kullanmak kodu otomatik olarak sadeleştirmez. Operatörü, işlem akışını daha görünür yaptığı durumlarda tercih etmek daha dengeli bir yaklaşımdır. PHP Manual, Functional Operators bu davranışı, sol değerin tek parametre alan bir callable'a aktarılması olarak tanımlar.
Pipe sözdizimi ve çağrı sırası nasıl okunur?
Pipe zincirini soldan sağa okuyabilirsin: Önce soldaki ifade değerlendirilir, ardından çıkan sonuç sağdaki callable'a gönderilir. Bu çağrının döndürdüğü değer, zincirdeki bir sonraki |> adımının sol tarafı olur. Zincirin tamamının değeri ise son çağrının dönüş değeridir.
Genel biçim şöyledir:
$sonuc = $deger
|> ilkIslem(...)
|> ikinciIslem(...)
|> (fn($mevcutDeger) => ucuncuIslem($mevcutDeger));
Bu ifadede çağrı sırası nettir:
$degerdeğerlendirilir.- Sonuç,
ilkIslemçağrısına verilir. ilkIslemdönüşü,ikinciIslemçağrısına gider.- Son değer, arrow function içindeki
$mevcutDegerparametresi olur.
Sağ tarafta geçerli bir PHP callable bulunmalıdır. Bu, first-class callable, closure, çağrılabilir nesne veya böyle bir callable üreten bir ifade olabilir. Çağrının tek parametreyle çalışabilmesi gerekir; birden fazla zorunlu parametresi olan fonksiyonlar pipe ile doğrudan kullanılamaz. Arrow function zincir adımı olarak kullanıldığında parantez içinde yazılması, söz diziminin açık kalmasını sağlar.
İç içe fonksiyon çağrısı ile pipe kullanımı karşılaştırması
Aynı metin temizleme işlemi, klasik biçimde fonksiyonların iç içe yazılmasıyla veya pipe zinciriyle ifade edilebilir. Her iki örnek de önce baştaki ve sondaki boşlukları kaldırır, sonra kelimeler arasındaki boşluğu kısa çizgiye dönüştürür, son olarak metni büyük harfe çevirir. PHP’nin resmî kılavuzuna göre |> operatörünün sağ tarafında tek parametre kabul eden bir callable bulunmalıdır. PHP Functional Operators kılavuzu, yerleşik fonksiyonların first-class callable biçimiyle ve tek parametreli closure’larla bu zincirde kullanılabildiğini açıklar.
Klasik iç içe çağrıda çalışma sırası kodun içinden dışına doğrudur:
<?php
$raw = " php 8.5 pipe operator ";
$result = strtoupper(
str_replace(' ', '-', trim($raw))
);
echo $result, PHP_EOL;
Önce trim($raw) dış boşlukları siler. Ardından str_replace() boşlukları kısa çizgiye çevirir. En dıştaki strtoupper() ise sonucu büyük harfe dönüştürür. Beklenen çıktı şöyledir:
PHP-8.5-PIPE-OPERATOR
Pipe biçiminde ise aynı adımlar yukarıdan aşağıya görünür:
<?php
$raw = " php 8.5 pipe operator ";
$result = $raw
|> trim(...)
|> (fn(string $text): string => str_replace(' ', '-', $text))
|> strtoupper(...);
echo $result, PHP_EOL;
İlk satırdaki değer trim(...) fonksiyonuna gider. Sonraki closure, tek metin parametresini alır ve str_replace() çağrısının üçüncü argümanı olarak kullanır. Son aşamada strtoupper(...) çalışır. Çıktı yine PHP-8.5-PIPE-OPERATOR olur. Closure’ın parantez içinde yazılması gereklidir; ayrıca str_replace() birden fazla zorunlu parametre aldığı için pipe’ın sağ tarafına doğrudan konulmamıştır.
| Biçim | Okuma yönü | Ara adımların görünürlüğü | Küçük dönüşümlerde pratiklik |
|---|---|---|---|
| İç içe çağrı | İçten dışa | Fonksiyonların içine bakmayı gerektirir | Az sayıda çağrıda doğrudan kalabilir |
| Pipe zinciri | Yukarıdan aşağıya | Her dönüşüm ayrı satırda görülebilir | Ardışık dönüşümlerde düzenli bir akış sunabilir |
Hangi durumda pipe zinciri daha anlaşılır olabilir?
Bir değer üzerinde birbirini izleyen dönüşümler varsa pipe zinciri değerlendirilebilir. Metni temizleme, diziyi filtreleme, sonucu biçimlendirme gibi adımlar doğal bir sıra oluşturduğunda, her işlemin çıktısının bir sonraki işleme aktarıldığı daha belirgin hâle gelir.
Buna karşılık tek ve kısa bir fonksiyon çağrısında iç içe kullanım daha doğrudan olabilir. Hata ayıklarken belirli bir ara sonucu incelemek gerektiğinde ise zinciri geçici değişkenlere ayırmak okunabilirliği artırabilir. Örneğin hangi dönüşümün beklenmeyen değer ürettiğini görmek için ilgili adımdan sonra sonucu değişkende tutabilirsin.
Seçimde ekip uyumluluğu da önemlidir. Pipe yalnızca PHP 8.5 ve sonrasında kullanılabilir; ayrıca sağ taraftaki callable tek parametreyle çağrılabilmelidir. Birden fazla zorunlu parametre isteyen fonksiyonlar için closure ile uyarlama yapmak veya klasik çağrıyı korumak daha açık bir tercih olabilir. Referansla parametre alan fonksiyonlar pipe içinde kullanılamaz.
Projede kullanmadan önce sürüm ve uyumluluk nasıl kontrol edilir?
Pipe operator, PHP 8.5 ve sonraki sürümlerde kullanılabilir. Bu nedenle kodu yazmadan önce yalnızca geliştirme bilgisayarındaki değil, uygulamanın çalışacağı sunucu, konteyner veya barındırma ortamındaki PHP sürümünü de kontrol etmelisin. Özelliğin çalışma mantığı ve geçerli callable koşulları için PHP resmî kılavuzundaki işlevsel operatörler bölümünü inceleyebilirsin.
- Çalışma ortamındaki PHP sürümünü kontrol et. Komut satırında aşağıdaki komut, kullanılan PHP sürümünü gösterir:
php -r 'echo PHP_VERSION, PHP_EOL;'
Beklenen çıktı, ortamda kurulu sürüm numarasıdır. Örneğin 8.5.x biçiminde bir sonuç görmen gerekir. Web sunucusu ile komut satırının farklı PHP sürümleri kullanabileceğini unutma. Bu nedenle uygulama çalışırken kullanılan ortamı ayrıca kontrol etmek gerekir.
- Bağımlılıkların PHP gereksinimlerini incele. Projedeki
composer.jsondosyasında yer alanrequire.phpkısıtını ve kullanılan paketlerin PHP sürümü beklentilerini kontrol et. PHP sürümünü yükseltmek veya yeni bir sözdizimi kullanmak, bazı bağımlılıkların çalışma koşullarıyla çakışabilir. - Mevcut kod standardını değerlendir. Proje daha eski PHP sürümlerini destekliyorsa pipe operator kullanımı uyumluluk sorununa yol açabilir. Ayrıca ekip içinde iç içe fonksiyon çağrıları mı, yoksa dönüşüm zincirleri için pipe biçimi mi tercih edildiğini belirlemek, kodun tutarlı kalmasına yardımcı olur.
- Örneği proje testlerinde dene. Pipe kullanan kodu doğrudan üretim ortamına taşımadan önce birim testleri, entegrasyon testleri ve ilgili statik analiz kontrolleriyle çalıştır. Özellikle zincirdeki her callable'ın önceki adımdan gelen veri türünü kabul ettiğini doğrula.
Çalıştırma ortamı PHP 8.5 öncesindeyse |> sözdizimi tanınmayabilir ve hata dosya çalıştırılmadan, ayrıştırma aşamasında ortaya çıkabilir. Bu nedenle sürüm kontrolü, pipe zincirinin kendisini yazmadan önce yapılması gereken ilk adımdır.
Sık Sorulan Sorular
PHP pipe operator hangi sürümde kullanılabilir?
Pipe operator, PHP 8.5 ile kullanılmaya başlanmıştır ve PHP 8.5 ile sonraki sürümlerde yer alır. Özelliğin PHP 8.5 ile duyurulduğu bilgisi için PHP 8.5.0 resmî sürüm duyurusuna bakabilirsin.
Pipe zincirindeki fonksiyonlar hangi sırayla çalışır?
İşlem soldan sağa ilerler. Soldaki ifade önce değerlendirilir, çıkan değer ilk callable'a aktarılır. İlk callable'ın sonucu sonraki adıma, ardından onun sonucu bir sonraki adıma gönderilir.
Her PHP fonksiyonu pipe operator ile kullanılabilir mi?
Hayır. Sağ tarafta geçerli bir callable bulunmalı ve bu callable pipe tarafından gönderilen tek değeri uygun biçimde kabul etmelidir. Ek parametre gerektiren veya farklı bir çağrı düzenine ihtiyaç duyan fonksiyonlar doğrudan uygun olmayabilir; böyle durumlarda işlevi bir closure içinde sarmalamak gerekebilir.
Pipe operatorı projeye eklemeden önce sürümü, bağımlılıkları, kod standardını ve test sonuçlarını birlikte değerlendirmek, daha güvenli ve tutarlı bir kullanım sağlar.