# PHP 5.6 yenilikleri: variadic fonksiyonlar ve ** operatörü

> PHP 5.6 ile gelen değişken sayıda argüman (variadic) desteği ve üs alma operatörünü örneklerle anlattım.

- Yayın: 2015-06-07
- Kategori: Diller
- Etiketler: PHP
- Okuma süresi: 3 dk okuma
- Kaynak: https://www.muhammetsafak.com.tr/blog/php-5-6-yenilikleri-variadic-fonksiyonlar-ve-ust-uste-operatoru/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
PHP 5.6 geçen yılın Ağustos ayında çıkmıştı ve o günden bu yana kullanıyorum. Büyük bir sürüm değişikliği değil ama birkaç eklenti günlük iş akışını küçük ölçüde kolaylaştırıyor. Bu yazıda özellikle iki yeniliği ele alacağım: değişken sayıda argüman (variadic) desteği ve üs alma operatörü. Bunların yanı sıra sabit ifadeler ve `use` ile [namespace](/blog/phpde-namespace-ile-kodu-duzenli-tutmak) içe aktarmanın yeni biçimine de değineceğim.

## Değişken sayıda argüman: ... operatörü

PHP'de bir fonksiyona kaç argüman geleceğini önceden bilmediğiniz durumlarda şimdiye kadar `func_get_args()` kullanırdınız:

```php
function topla() {
    $sayilar = func_get_args();
    return array_sum($sayilar);
}

echo topla(1, 2, 3, 4); // 10
```

Bu çalışıyor ama fonksiyon imzasına bakarak ne aldığını anlayamıyordunuz. Parametre yoktu, içinde ne döndüğünü görmek için gövdeye bakmanız gerekiyordu.

PHP 5.6 ile **değişken sayıda argüman (variadic function)** desteği dile eklendi. `...` (üç nokta) operatörü, fonksiyon tanımında kullanıldığında kalan tüm argümanları bir dizi olarak topluyor:

```php
function topla(int ...$sayilar): int {
    return array_sum($sayilar);
}

echo topla(1, 2, 3, 4); // 10
```

Fonksiyon imzasından "bu fonksiyon sıfır ya da daha fazla tamsayı alıyor" anlaşılıyor. Aynı zamanda tip bildirimiyle (PHP 5.6'da hâlâ hint olarak) birleştirilebiliyor.

Sabit argümanlarla birlikte de kullanılabiliyor. Sabit argümanlar her zaman önce geliyor:

```php
function birlestir(string $ayrac, string ...$parcalar): string {
    return implode($ayrac, $parcalar);
}

echo birlestir(', ', 'Ali', 'Veli', 'Ayşe'); // Ali, Veli, Ayşe
```

Bunun ötesinde `...` operatörü çağrı tarafında da işe yarıyor — diziyi argümanlara "açmak" için:

```php
$degerler = [3, 7, 1, 9, 2];
echo max(...$degerler); // 9
```

Daha önce bunu `call_user_func_array()` ile yapardınız. Bu sözdizimi çok daha okunabilir.

### func_get_args() ile variadic arasındaki fark

`func_get_args()` hâlâ çalışıyor; zaten var olan kodu kırmıyor. Ama variadic'in getirdiği şey yalnızca sözdizim kolaylığı değil: IDE ve statik analiz araçları artık bu parametreyi anlıyor. PHP 5.6 döneminde tam özellikli bir statik analiz yoktu, ama en azından PhpStorm `...$sayilar` parametresini görünce tip kontrolü yapabiliyor. `func_get_args()` kullanan fonksiyonlarda IDE parmağını bile oynatmıyordu.

## Üs alma operatörü: **

PHP'de üs hesabı için `pow()` fonksiyonu kullanılırdı:

```php
$sonuc = pow(2, 8); // 256
```

PHP 5.6 ile **üs alma operatörü (exponentiation operator)** `**` eklendi. Artık şöyle yazabiliyorsunuz:

```php
$sonuc = 2 ** 8; // 256
```

Matematiksel ifadelerin içinde çok daha doğal görünüyor:

```php
$alan   = $yaricap ** 2 * M_PI;
$hacim  = (4 / 3) * M_PI * $yaricap ** 3;
```

Küçük bir sözdizim şekeri ama formül ağırlıklı hesaplamalar yapıyorsanız okunabilirliği gerçekten artırıyor.

## Sabit ifadeler (constant expressions)

PHP 5.6 öncesinde sabitlere yalnızca sabit değerler atanabiliyordu:

```php
const VERGI = 18;
const VERGI_CARPAN = 1.18; // Önceden bunu hesaplayamazdınız
```

PHP 5.6'dan itibaren sabitler ve `define()` içinde basit ifadeler kullanılabiliyor:

```php
const VERGI      = 18;
const VERGI_ORAN = VERGI / 100;
const CARPAN     = 1 + VERGI / 100;
```

Hesaplamayı kod içinde yapıp sabite yazmak yerine kaynaktan türetebiliyorsunuz. `VERGI` değişirse `CARPAN` da otomatik güncelleniyor.

## use ile grup içe aktarma

PHP 5.6 aynı namespace altındaki birden fazla sınıfı tek `use` ifadesiyle içe aktarmanıza izin vermiyor henüz (bu PHP 7.0 ile geliyor), ama bu sürümde fonksiyon ve sabit içe aktarma desteği eklendi:

```php
use function Yardimci\Matematik\topla;
use function Yardimci\Matematik\carp;
use const Yardimci\Matematik\PI;
```

Daha önce `use` yalnızca sınıflar için kullanılıyordu. Bu ekleme namespace'li yardımcı fonksiyonları daha temiz kullanmayı sağlıyor.

## Küçük ama değerli eklemeler

Bu değişikliklerin hiçbiri PHP'yi temelden değiştirmiyor. Ama `func_get_args()` yerine `...` kullanmak, `pow()` yerine `**` yazmak gibi küçük tercihler kod okunabilirliğini kademeli olarak artırıyor. Yeni özelliği öğrenmek için özellikle çaba sarf etmek gerekmiyor; projede bir ihtiyaç ortaya çıkıyor, doğal kullanım yerine yerleşiyor. Geçen yıl [generator ve `yield`](/blog/php-55-generator-yield-ile-buyuk-veri-kumelerini-gezmek) de tam böyle yerleşmişti.

PHP 7.0 bu yıl içinde bekleniyor. Tip bildirimleri ve performans iyileştirmeleriyle çok daha büyük bir sürüm geliyor. Ama şimdilik 5.6 üzerinde çalışıyorum ve bu eklemeler yerlerini buldu.
