PHP 7.3: esnek heredoc ve liste atamaları
PHP 7.3'ün getirdiği esnek heredoc sözdizimi ve liste atamalarının okunabilirliğe katkısını gerçek örneklerle değerlendiriyorum.
PHP dünyasında büyük sürüm atlamalarını heyecanla takip ederim — 7.0 ve 7.1 gerçekten dönüm noktasıydı. PHP 7.3 ise “küçük bir sürüm” damgası yedi çıkar çıkmaz; ama bir süre kullandıktan sonra görüyorum ki küçük dil eklemeleri, uzun vadede kod okunabilirliğini ciddi ölçüde etkiliyor. Bugün iki değişikliğe odaklanmak istiyorum: flexible heredoc sözdizimi ve liste atamalarındaki kısa sözdizim desteği.
Bu iki özellik de göz alıcı değil. Birisine göstersen “bunun için mi bekliyorduk?” der. Ama kod yazarken tekrarlayan sürtünmeleri azaltan şeyler, günün sonunda farkı yaratır.
Flexible Heredoc Syntax
Heredoc, PHP’de birden fazla satır içeren metin bloklarını tanımlamak için kullanılan sözdizimdir. PHP 7.2 ve öncesinde bir kural vardı: kapanış etiketinin satır başında, hiçbir girintisiz durması gerekiyordu. Bu sınırlama, kodunuz girintili yazılmışsa görsel bir acıya dönüşüyordu.
Önceki duruma bakalım:
<?php
class Mailer
{
public function buildBody(string $name): string
{
return <<<EOT
Merhaba $name,
Mesajınız alındı.
EOT;
// Kapanış etiketi sola dayalı olmak zorunda — sınıf girintisinin dışında
}
}
Bu kodu IDE’de okumak bana hep rahatsızlık verdi. Sınıfın içinde girintili çalışırken kapanış etiketi birden sola kaçıyor; görsel olarak dağınık.
PHP 7.3 ile kapanış etiketi artık girintili yazılabiliyor:
<?php
class Mailer
{
public function buildBody(string $name): string
{
return <<<EOT
Merhaba $name,
Mesajınız alındı.
EOT;
}
}
Kapanış etiketinin girintisi, içerik satırlarından otomatik olarak çıkarılıyor. Yani EOT önündeki sekizli boşluk, gövdenin her satırından da düşürülüyor. Sonuç aynı metin; görünüm ise çok daha temiz.
Nowdoc için de (tek tırnaklı, değişken enjeksiyonu olmayan varyant) aynı kural geçerli:
<?php
$sql = <<<'SQL'
SELECT id, name
FROM users
WHERE active = 1
SQL;
SQL sorgularını, şablon metinlerini ya da uzun JSON parçalarını bu şekilde yazarken artık girintiden ödün vermek zorunda değilim.
Girintileme tuzağı: sekme mi, boşluk mu?
Burada dikkat edilmesi gereken bir nokta var: kapanış etiketinin girintisiyle içerik satırlarının girintisi aynı karakter tipini kullanmalı. Biri sekme, diğeri boşluk kullanırsa PHP ParseError fırlatıyor. Bu, özellikle farklı editör ayarlarına sahip bir ekipte ya da Git’te sekme/boşluk dönüşümü yapılmışsa karşılaşılan bir tuzak. Editör ayarlarınızı proje genelinde tutarlı tutmak bu sorunu önlüyor.
Liste atamalarında kısa sözdizimi
PHP 7.1, list() yerine kısa köşeli parantez sözdizimini tanıttı: [$a, $b] = $dizi. Bu çok kullanışlıydı. Fakat aynı sürümde list() ile tuş atlamanın (list(, $ikinci) = $dizi) kısa sözdizimde çalışmadığı görüldü. PHP 7.3 bu tutarsızlığı gidiriyor.
Bir CSV satırını parse ettiğimizi düşünelim. İlk sütun bizi ilgilendirmiyor:
<?php
// PHP 7.1 ile bu çalışıyordu:
list(, $isim, $email) = explode(',', $satir);
// Kısa sözdizimi (PHP 7.1'de hata veriyordu, 7.3 ile çalışır):
[, $isim, $email] = explode(',', $satir);
Küçük görünüyor, ama pratikte list() ve [] sözdizimini aynı kurallara tabi tutmak demek: zihinsel yük azalıyor, tutarsızlık ortadan kalkıyor.
Çok boyutlu veri işlerken de bu tutarlılık işe yarıyor. Örneğin bir veritabanı sorgusu satır döndürüyorsa ve yalnızca belirli kolonlara ihtiyacınız varsa, atlama sözdizimini iç içe kullanabiliyorsunuz. Bunu her kullandığımda “neden bu kadar uzun sürdü?” diye düşünüyorum.
Bu değişiklikler neden önemli?
Bir dil özelliğini değerlendirirken “ne kadar süre kullanacağım?” diye sorarım. Heredoc ile çalışmayan büyük bir proje yok denecek kadar az. Çok boyutlu veri ayrıştırma, hemen hemen her uygulamada var. Bu yüzden 7.3’ün “küçük sürüm” damgasını haksız buluyorum — doğru alanda, doğru sürtünmeleri azaltıyor.
Öte yandan bu değişiklikler, yükseltme için yeterli bir gerekçe mi? Tek başına hayır. Ama projeniz PHP 7.2’den geçiş planlıyorsa, bu iyileştirmeler kararı kolaylaştıran küçük artılar olarak hesaba katılabilir.
PHP’nin küçük sürümlerini küçümsememek gerekiyor. Büyük paradigma değişimleri nadiren gelir; sürtünmeyi azaltan birikimli iyileştirmeler ise her gün hissedilir.