PHP 7.2 ve modern PHP alışkanlıkları
PHP 7.2 ile gelen yenilikleri ve dilin bugün geldiği noktayı günlük kod yazım alışkanlıklarıma nasıl yansıttığımı anlatıyorum.
PHP 7.2, Kasım 2017’de yayımlandı. O günden bu yana birkaç ay geçti ve yavaş yavaş bu sürümü üretim projelerinde kullanmaya başladım. Geriye dönüp baktığımda, PHP 7 serisiyle birlikte dili kullanma biçimimde ne kadar köklü değişiklikler olduğunu daha net görüyorum. Bu yazıda PHP 7.2’nin getirdiklerinden kısa kısa söz edecek, asıl olarak “modern PHP” kavramının günlük alışkanlıklarıma nasıl yansıdığını paylaşacağım.
PHP 7.2 ne getirdi?
Bu sürümün en dikkat çekici yeniliği object type hint desteğidir. Artık bir fonksiyon parametresini ya da dönüş değerini object olarak bildirebiliyorsunuz. PHP 7.0 ile gelen scalar type declarations zaten büyük bir adımdı; object ise bu tablonun eksik parçasını tamamlıyor gibi hissettiriyor.
<?php
function logObject(object $obj): void
{
echo get_class($obj) . "\n";
}
Küçük görünen bu eklemenin pratikte önemli bir yansıması var: türünü bilmediğiniz ama kesinlikle nesne olan bir parametreyi artık tip güvencesiyle karşılayabiliyorsunuz.
Diğer önemli değişiklik ise Countable interface’ini uygulayan nesnelerin count() fonksiyonuyla sayılabilmesi meselesidir. Bu bir yenilikten çok PHP’nin tutarlılığını artıran bir düzeltme; ama genel gidişatı yansıtıyor: dil, öngörülebilir davranmak istiyor.
Günlük alışkanlıklarda neyin değiştiği
PHP 7.0’dan beri kullandığım ve artık vazgeçemediğim birkaç alışkanlık var.
Return type declaration bunların başında geliyor. Bir fonksiyonun ne döndüreceğini bilmek, hem kodu yazan hem de kodu okuyan için büyük rahatlık sağlıyor. “Bu metodun döneceği şeye güvenebilir miyim?” sorusunu imzadan okuyabiliyorsunuz.
<?php
function getUserById(int $id): ?User
{
return User::find($id);
}
?User biçimindeki nullable tip bildirimi PHP 7.1 ile geldi ve sıkça kullandığım yapılardan biri hâline geldi. Fonksiyonun null da döndürebileceğini çağıran tarafa açıkça söylüyor.
declare(strict_types=1) bildirimi de artık her dosyanın başına eklediğim standart satırlardan biri. Bu seçeneği açtığınızda PHP, yanlış türdeki bir değer geçirildiğinde sessizce dönüştürmek yerine hata fırlatıyor. İlk başta “neden kendime ekstra kural koyayım” diye düşünmüştüm; ama kısa süre içinde bu seçeneğin birçok gizli hatayı erkenden yakalamanı sağladığını fark ettim.
<?php
declare(strict_types=1);
function multiply(int $a, int $b): int
{
return $a * $b;
}
multiply('3', 4); // strict_types=1 olmasa sessizce çalışırdı, şimdi TypeError fırlatır
Tip bildirimleri alışkanlık meselesi
Tip bildirimlerinin başta yük gibi hissettirdiğini söylemeliyim. Küçük bir betik yazarken her parametreye tip eklemek gereksiz bir formalite gibi görünebiliyor. Ama orta büyüklükte bir projede birkaç ay sonra kendi kodunuza baktığınızda, o bildirimler sayesinde metodun nasıl çağrılması gerektiğini tek bakışta anlayabiliyorsunuz.
Tip bildirimi aynı zamanda IDE desteğini de güçlendiriyor. PhpStorm gibi bir editör kullandığınızda, yanlış tipte bir değer geçirdiğinizde sizi hemen uyarıyor. Bu feedback loop, hataları runtime’a taşımadan editörde yakalamak açısından çok değerli.
PSR standartları ve kod biçemi
Modern PHP alışkanlıklarının bir parçası da PSR (PHP Standards Recommendations) standartlarına uymak. PSR-2 kod biçemi kurallarını birkaç yıldır uyguluyorum; bu standart benim için artık düşünmeden uyduğum bir reflekse dönüştü. Bir projeye yeni birinin katılması ya da eski koda aylar sonra bakılması gerektiğinde, tutarlı biçem beklenmedik kazanımlar sağlıyor.
PHP-CS-Fixer ya da PHP CodeSniffer gibi araçlar bu uyumu otomatik hâle getiriyor. Kodu commit etmeden önce çalıştırdığınızda biçem hatalarını elle düzeltme zahmetinden kurtuluyorsunuz.
Composer ve bağımlılık yönetimi
“Modern PHP” denilince aklıma gelen bir diğer konu Composer. 2014’ten beri kullanıyorum ama bu araçla ilgili alışkanlıklarım zaman içinde olgunlaştı. Artık her proje bir composer.json ile başlıyor; paketlerin versiyonlarına dikkat ediyorum, require-dev ile geliştirme bağımlılıklarını üretim bağımlılıklarından ayırıyorum.
autoload bölümünü iyi yapılandırmak da önemli. PSR-4 autoloading standardını doğru ayarladığınızda sınıf bulunamadı hataları ortadan kalkıyor ve kod organizasyonu netleşiyor.
Dilin gidişatı
PHP 5.6’dan PHP 7.0’a geçerken “bu dil değişiyor” diye hissettim; PHP 7.2’ye geldiğimizde ise “bu dil artık olgunlaşıyor” diyebiliyorum. Her yıl küçük ama anlamlı iyileştirmeler geliyor; dilin öngörülebilir, tip bilinçli ve daha az “sihirli” bir hâle geldiğini görüyorum.
Yeni özellikleri projeye dahil etmek için eski kodu baştan yazmam gerekmiyor; tek tek fonksiyonlara tip bildirimi ekleyerek, strict_types açarak adım adım ilerliyorum. Bu kademeli geçiş, büyük bir projeyi bozmadan modernleştirmenin pratik yolu gibi görünüyor bana.
Tip güvenceli ve okunabilir PHP yazmak için 2018 başı iyi bir zaman dilimi. Dil araçları hazır, ekosistem bu yönde ilerliyor.