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.