PHP 7 ile gelen yenilikler

PHP 7 ile birlikte gelen tür bildirimi, null birleştirici, spaceship operatörü, sabit diziler, anonim sınıflar, yield deyimi, hata yönetimi ver performans yenilikleri ile ilgili bilgiler yer alıyor.

Tür bildirimi

Tür bildirimi fonksiyonların çalışması için gerekli olan parametrelerin veri türünü belirtir.

NYP içerisinde sıklıkla kullanılan tür bildirimi PHP 7 ile birlikte genişletilerek bool, float, int ve string veri türü desteği getirilmiştir.

Toplama işlemi için parametre olarak alınan iki sayı yerine harf veya cümle yazıldığında PHP uyarı verecek ve istenmeyen bir sonuç üretecektir.

<?php

function Topla($sayi1, $sayi2) {
  return $sayi1 + $sayi2;
}

echo Topla("Yusuf", "SEZER");  // ??

?>

PHP 7 ile birlikte desteği genişleyen tür bildirimi özelliği ile parametre türü (bool, float, int, string) belirtilebilir.

<?php

function Topla(int $sayi1, int $sayi2) {
  return $sayi1 + $sayi2;
}

echo Topla("Yusuf", "SEZER");  // ??

?>

Girilen parametre türü belirtilenden farklıysa PHP Fatal error verip çalışmayı durduracaktır.

PHP esnek yapısı sayesinde tür dönüşümünü kendisi yapmaktadır.

<?php

function Topla(int $sayi1, int $sayi2) {
  return $sayi1 + $sayi2;
}

echo Topla("55", "10");  // ??

?>

Bu durumun önüne geçmek için declare anahtar kelimesi ile sıkı denetimin etkinleştirilmesi gerekir.

<?php

declare(strict_types = 1);

function Topla(int $sayi1, int $sayi2) {
  return $sayi1 + $sayi2;
}

echo Topla("55", "10");  // ??

?>

Aşağıdaki tür bildirimi örneğini inceleyebilirsiniz.

<?php

declare(strict_types = 1);

function ornekFonksiyon(bool $islem, float $ucret, int $miktar, string $birim)
{
    if ($islem) {
        $sonuc = $ucret * $miktar;
    } else {
        $sonuc = $ucret;
    }

    return $sonuc . " " . $birim;
}

echo ornekFonksiyon(true, 15.28, 5, "TL");

?>

Dönen tür bildirimi

Fonksiyon ve metotlar işlevini bitirince return anahtar kelimesiyle değer döndürür.

PHP 7 öncesinde döndürülen değer ile ilgili bildirim yapma gibi bir özellik bulunmuyordu.

Dönen tür bildirimi ile fonksiyon veya metotların dönüş türünü bildirme özelliği getirilmiştir.

Dönen türü bildirimi, tür bildirimi özelliğinde kullanılan bool, float, int, string vb. veri tipi olabilir.

<?php

function Topla($sayi1, $sayi2): int
{
    return $sayi1 + $sayi2;
}

var_dump(Topla(55, 10.9));  // ??
var_dump(Topla(55, 10));  // ??

?>

Sıkı denetim ile istenmeyen durumların önüne geçilebilir.

<?php

declare(strict_types = 1);

function Topla($sayi1, $sayi2): int
{
    return $sayi1 + $sayi2;
}

var_dump(Topla(55, 10.9));  // ??
var_dump(Topla(55, 10));  // ??

?>

Ancak sıkı denetimin etkinleştirilmesi her zaman faydalı olmayabilir.

null birleştirici operatörü

PHP 7 öncesinde bir değişkenin tanımlı olup olmadığına bakmak için isset fonksiyonundan yararlanıyorduk.

<?php

$adi = isset($_GET['adi']) ? $_GET['adi'] : 'tanımlı değil';

echo $adi;

?>

null birleştiri operatörü (??) ile birlikte bu işlem daha kolay hale geldi.

<?php

$adi = $_GET['adi'] ?? 'tanımlı değil';

echo $adi;

?>

Örnekte görüldüğü gibi null birleştirici operatörü sayesinde değişken kontrolü daha kolay hale gelmiştir.

Spaceship operatörü

Sayısal değerler eşit, büyük veya küçük olmak üzere üç farklı şekilde karşılaştırılır.

<?php

$sayi1 = 5;
$sayi2 = 10;

if ($sayi1 == $sayi2) {
    echo "Sayılar eşit";
} elseif ($sayi1 > $sayi2) {
    echo "{$sayi1} sayısı {$sayi2} sayısından büyük";
} else {
    echo "{$sayi2} sayısı {$sayi1} sayısından büyük";
}

?>

Spaceship operatörü sayesinde bu işlem daha kolay hale geldi.

<?php

$sayi1 = 5;
$sayi2 = 10;

echo $sayi1 <=> $sayi2;

?>

Spaceship operatörü her iki sayı değer eşitse 0,

operatörün sağındaki değer büyükse -1,

operatörün solundaki değer büyükse 1 değerini verir.

Spaceship operatörü sıralama işlemlerinde kullanılan callback/geri bildirim fonksiyonları için kolaylık sağlayacaktır.

Sabit diziler

PHP ile sabit tanımlamak için kullanılan define fonksiyonu genişletilerek sabit dizilerin tanımlanmasına imkan verir hale geldi.

<?php

define('LISTE', ['Elma', 'Armut', 'Portakal', 'Muz', 'Kivi', 'Karpuz', 'Çilek']);

echo LISTE[0];

?>

PHP 7 ile gelen sabit dizi özelliğiyle uygulama geliştirmede kolaylık sağlayacaktır.

Anonim sınıflar

NYP sınıf yapısının sadece tanımlandığı yerde kullanılması için oluşturulan sınıflara anonim sınıflar denir.

Anonim sınıflar anonim fonksiyonlara benzer.

<?php

$bilgiler = new class {

    private $adi = "";
    private $soyadi = "";

    public function adiSoyadi(string $adi, string $soyadi)
    {
        $this->adi = $adi;
        $this->soyadi = $soyadi;
    }

    public function adi()
    {
        return $this->adi;
    }

    public function soyadi()
    {
        return $this->soyadi;
    }
};

$bilgiler->adiSoyadi("Yusuf", "SEZER");

echo $bilgiler->adi() . " " . $bilgiler->soyadi();

?>

Closure::call()

Sınıf içindeki metot ve özelliklere dolaylı yoldan erişmek için kullanılan bir yapıdır.

<?php

class Ogrenciler
{

    private static $ogrenciKapasite = 45;

    private function ogrenciKapasite()
    {
        return static::$ogrenciKapasite;
    }

}

$oKapasite = function() {
    return $this->ogrenciKapasite();
};

echo $oKapasite->call(new Ogrenciler);

?>

use Deyimi

NYP namespace için kullanılan use deyimi PHP 7 ile daha esnek hale geldi.

<?php

// PHP 7 öncesi
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ sonrası
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

?>

yield Deyimi

NYP içinde bulunan ve elemanları dolaşmaya yarayan traversable yapısının fonksiyonlar için olanına benzer.

<?php

function gen()
{
    yield 1;
    yield 2;
    yield from gen2();
}

function gen2()
{
    yield 3;
    yield 4;
}

foreach (gen() as $val) {
    echo $val, PHP_EOL;
}

?>

Geri dönüş değerini almak için getReturn ifadesi geliştirilmiştir.

<?php

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

?>

Hata yönetimi

Geliştirilen uygulamalarda çeşitli hatalar olabilir.

Bunlar olmayan bir fonksiyonun kullanılması, fonksiyona yanlış parametrenin gönderilmesi olabilir.

PHP 7 öncesinde bu hatalar PHP tarafından yönetiliyor ve bazı hatalar try-catch bloğuna yönlendirilebiliyordu.

PHP 7 ile geliştirilen Throwable arayüzü ile ArithmeticError, AssertionError, DivisionByZeroError, ParseError, TypeError vb. hataların geliştirici tarafından yönetilebilmesi sağlanmıştır.

<?php

//Type error
try {

    function add(int $a, int $b): int
    {
        return $a + $b;
    }

    echo add(array(), array());
} catch (TypeError $t) {
    echo "Type error: " . $t->getMessage() . PHP_EOL;
}

?>

Hata yönetiminin daha esnek olması oluşan hataların kayıt altına alınması ve düzeltilmesini kolaylaştıracaktır.

intdiv fonksiyonu

PHP ile bölme işlemleri “/” operatörü ile yapılınca sonuç noktalı veya virgüllü çıkabilmektedir.

Bölme işleminin sonucunun tam sayı olmasını garanti etmek için PHP 7 ile birlikte intdiv fonksiyonu geliştirilmiştir.

<?php

var_dump(intdiv(10, 3));

?>

Fonksiyon sonucun tam sayı olacağını garanti ettiğinden geliştirilen uygulamadaki işlemler tutarlı sonuç verecektir.

PHP 7 ile geliştirilen yeniliklerden birisi olan session ayarları ile ilgili bilgiler yer almaktadır.

Session ayarları

PHP 7 öncesinde php.ini dosyasından değiştirilen ayarlar artık session_start fonksiyonu ile değiştirilebilmektedir.

<?php

session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true,
]);

?>

Session ayarlarının kodlarla yapılması uygulama geliştirirken faydalı olacaktır.

Performans

PHP 7 ile gelen çeşitli özellikere ek olarak PHP çekirdeğindeki çeşitli değişikliklerle PHP 7 öncesine göre hız konusunda daha verimli olduğu çeşitli denemelerle kanıtlanmıştır.

Aşağıdaki kodlar PHP 5 ve PHP 7 ile çalıştırıldığında PHP 7’nin performansıyla ilgili bilgi verecektir.

<?php

$a = [];

for ($i = 0; $i < 100000; $i++) {
    $a[] = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr'];
}

$memory = memory_get_usage();

echo round($memory / 1024 / 1024, 2) . " MB";

?>

Benzer şekilde diğer işlemler içinde artış hissedilir seviyelerdedir.

PHP 7 Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!