PHP 7.0: yıllardır beklenen sürümle gelen hız ve tip bildirimleri
PHP 7.0 bu hafta yayımlandı. Performans artışı, skaler tip bildirimleri ve dönüş tipleriyle ilk izlenimlerimi paylaşıyorum.
PHP 7.0 bu hafta resmi olarak yayımlandı. PHP 5.0’dan bu yana en büyük sürüm atlaması. Yıllardır konuşuluyordu; çeşitli kamuoyu yoklamalarında, konferanslarda, geliştirici bloglarında. Birkaç gündür okuyorum, test ediyorum ve ilk izlenimlerimi paylaşmak istedim.
Önceden belirteyim: bu yazı PHP 7.0’ı derinlemesine inceleyen bir rehber değil. Sürüm bu hafta çıktı ve ben henüz bir production projesinde kullanmadım. Ama öne çıkan değişiklikler dikkat çekici ve not almaya değer.
Performans artışı
PHP 7.0’ın en çok konuşulan özelliği dil değil, motor. Zend Engine 3 (PHP’nin temel motoru) yeniden yazıldı. PHP.net’teki benchmark (kıyaslama testi) sonuçlarına bakıldığında gerçek uygulamalarda PHP 5.6’ya kıyasla iki kata varan hız artışı görülüyor. WordPress, Drupal, Magento gibi yaygın uygulamalar üzerinde yapılan testlerde de belirgin iyileşme var.
Bu kadar büyük bir fark sadece dil özelliğiyle değil, motor seviyesinde yapılan optimizasyonlarla geliyor. Bellek kullanımı da düştü. Henüz test ortamında denemek dışında tam olarak pratiğe yansıyan etkiyi yaşamadım ama rakamlar etkileyici.
Skaler tip bildirimleri
PHP 5.x’te fonksiyon imzalarında yalnızca sınıf, interface ve array için tip bildirimi yapılabiliyordu. int, float, string, bool gibi temel (skaler - scalar) tipler için bu mümkün değildi.
PHP 7.0 ile artık mümkün:
function topla(int $a, int $b): int
{
return $a + $b;
}
echo topla(3, 4); // 7
echo topla(3.7, 4); // 7 — PHP 3.7'yi 3'e dönüştürür
Varsayılan davranış zorlayıcı değil (coercive mode) — PHP değeri mümkünse dönüştürmeye çalışıyor. Katı modu (strict mode) aktifleştirmek için dosyanın başına şunu eklemek gerekiyor:
declare(strict_types=1);
Katı modda topla(3.7, 4) çağrısı TypeError fırlatır. Hangi modu kullanacağınız ihtiyaca göre değişiyor; ama katı mod niyeti daha net ortaya koyuyor.
Dönüş tipi bildirimleri
Sadece parametreler değil, fonksiyon dönüş tipleri de bildirilebiliyor:
function bolKelimeler(string $cumle): array
{
return explode(' ', $cumle);
}
function tamSayi(float $sayi): int
{
return (int) $sayi;
}
void dönüş tipi PHP 7.0’da henüz yok (7.1’e geliyor), ama int, float, string, bool, array, callable, sınıf adları bildirilebiliyor. Bu, fonksiyon sözleşmelerini çok daha okunabilir kılıyor — kodu görmeden imzadan ne döndürdüğü anlaşılıyor.
Birleşik karşılaştırma operatörü: <=>
“Uzay gemisi operatörü” (spaceship operator) olarak da anılıyor. İki değeri karşılaştırıp -1, 0 veya 1 döndürüyor:
echo 1 <=> 2; // -1 (sol küçük)
echo 2 <=> 2; // 0 (eşit)
echo 3 <=> 2; // 1 (sol büyük)
usort() gibi fonksiyonlarda sıralama işlevi yazarken çok işe yarıyor:
usort($kullanicilar, function ($a, $b) {
return $a->yas <=> $b->yas;
});
Daha önce if ($a > $b) return 1; elseif ($a < $b) return -1; return 0; yazardınız.
Null birleştirme operatörü: ??
isset() kontrolü ile varsayılan değer atamayı kısaltıyor:
// Eski yöntem
$isim = isset($_GET['isim']) ? $_GET['isim'] : 'Misafir';
// PHP 7.0
$isim = $_GET['isim'] ?? 'Misafir';
Birden fazla zincirlenebiliyor:
$deger = $a ?? $b ?? $c ?? 'varsayilan';
Anonim sınıflar
PHP 7.0 anonim sınıf (anonymous class) desteği getiriyor. Tek kullanımlık bir nesne yaratmak için tam sınıf tanımlamak yerine:
$logger = new class {
public function log(string $mesaj): void
{
echo date('H:i:s') . ' — ' . $mesaj . PHP_EOL;
}
};
$logger->log('Bir şey oldu.');
Test yazarken ya da kısa süreli kullanım için sınıf adı tanımlamadan nesne oluşturmak işe yarıyor.
Şimdi ne yapmalı?
PHP 7.0 dün çıktı; production geçişi için birkaç ay beklemek mantıklı. Bağımlılıkların uyumunu kontrol etmek, framework desteğini doğrulamak gerekiyor. Laravel 5.1 ve Symfony 3.0 PHP 7.0 desteği için hazırlanmış durumda.
Ama test ortamında kurup denemek için bir neden yok. Skaler tip bildirimleri ve performans artışı, PHP’nin daha olgun bir platforma doğru gittiğini gösteriyor. Uzun süredir beklenen adımlar bunlar.