İçeriğe geç
Muhammet Şafak
Diller 3 dk okuma

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.


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

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:

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:

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:

$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ı:

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

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

$sonuc = 2 ** 8; // 256

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

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

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:

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:

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.

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.

Etiketler: #PHP
Paylaş:

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi