# 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.

- Yayın: 2015-12-06
- Kategori: Diller
- Etiketler: PHP
- Okuma süresi: 3 dk okuma
- Kaynak: https://www.muhammetsafak.com.tr/blog/php-7-0-yillarca-beklenen-surum-hiz-ve-tip-bildirimleri/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
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](/blog/php-5-6-yenilikleri-variadic-fonksiyonlar-ve-ust-uste-operatoru)'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:

```php
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:

```php
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:

```php
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:

```php
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:

```php
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:

```php
// Eski yöntem
$isim = isset($_GET['isim']) ? $_GET['isim'] : 'Misafir';

// PHP 7.0
$isim = $_GET['isim'] ?? 'Misafir';
```

Birden fazla zincirlenebiliyor:

```php
$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:

```php
$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](/blog/composera-gecis-php-bagimliliklarini-elle-yonetmeyi-birakmak) uyumunu kontrol etmek, framework desteğini doğrulamak gerekiyor. [Laravel 5.1](/blog/laravel-5e-gecis-yeni-dizin-yapisi-ve-env) 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.
