ile

PHP 7 ile gelen yenilikler

“We can not solve our problems with the same level of thinking that created them.”
“Sorunlar, onları yaratmış olan düşünce yapısı ile çözülemez.”

Albert Einstein

3 Aralık 2015 tarihinde PHP’nin 7. sürümü yayınlandı. “Biz 5.6 kullanıyorduk, ne oldu falan bir anda 6’yı atladınız.” dedik ama işin aslı sonradan anlaşıldı. 5.6 sürümü devam ederken 6. sürümü deneysel olarak yazmışlar zaten. Ama kimileri uğursuzluktan korunmak için sürüm atladıklarını söylüyor. Mesela Türkiye’de var mı bilmiyorum ama uçaklarda 13. numaralı koltuk olmuyor. Hatta İtalya’da işi abartıp bi kaç tane numarayı da uğursuz ilan etmişler.

PHP 7. sürüm logosu

Bir de PHP 7 çıkmadan önce kullanılmaya karar verilmiş ama yayınlanmamış olan yeni özellikleri, açıkgöz bazı PHP yazarları, ticari kazanç için PHP 6 adı altında kitaplaştırmışlar. PHP Grubu bu sürüm numarasıyla onlara da gol atmış oldu böylelikle.

Bu kitabı yazarken giriş seviyesinde bir dil tutturmaya çalıştım. PHP 7’nin benim bile anlamak için dikkatle okumak zorunda olduğum bazı özellikleri var, bunları zaten siz konunun mantığını anlayın ve araştırın diye (rehber kitaplara gıcık kaptığım için) anlatmıyorum.

Yani PHP 7 rehberi manual [https://secure.php.net/docs.php]
(https://secure.php.net/docs.php) zaten orda, binlerce sayfa, neden kitabı şişirmek için 15 yıllık hayatında 15 kere kullanacağın özelliği anlatayım ki? Yani mesela PHP’nin PDF kütüphanesini buraya yazmak biraz ayıp geliyor bana. Zaten PHP ile PDF yapmak istiyorsan açar ordan bakarsın. Herneyse ben konunun mantığını anlatıyorum, ek detayları araştırmak size kalıyor, çünkü mantığı anlamazsanız, zaten detayı okumanız hiçbir işe yaramaz. Birçok ders kitabı ve rehber kitapta en çok kızdığım konu bu.

Lafı fazla uzatmadan PHP 7 ile gelen müthiş yeniliklere gelelim.

İnanılmaz Performans artışı

Bildiğimiz gibi bizim yazdığımız PHP kodları, Zend Motoru Zend Engine denen zamazingo tarafından C kodlarına dönüştürülüyor. Zaten betik scirpt (betik ne demektir bilen varsa mail atsın) dillerinin özelliği bu. Derlenen compiled dillere göre en büyük avantajları daha esnek yapıda olmaları ve değişime daha kolay cevap verebilmeleri. İşte PHP Grubu yepyeni, gıcır gıcır bir Zend Motoru (motor nedir yahu) üretmiş. Bu sayede WordPress, Magento, ZendFramework, Drupal gibi popüler PHP yazılımlarıyla test yapmışlar ve %100 civarında performans artışları keşfetmişler. http://php.net/archive/2015.php

PHP 7 performans artışı

Uzay Gemisi Operatörü (Spaceship Operator)

Ben PHP ile gelen yeniliklerden en çok bunu sevdim, çünkü çok şirin. Bu ismi vermişler, çünkü operatör gerçekten uzay gemisine benziyor. <=>
Aslında ismi “üç taraflı karşılaştırma operatörü” yani three-way comparison operator ama ben uzay gemisi ismine bayıldım.

Şu kod bloğunu inceleyelim

<?php
$a = 5;
$b = 0;

echo $a <=> $b; // Cevap 1

?>

Yani soldaki sağdakinden büyük veya eşitse cevap 1, sağdaki büyük veya eşitse cevap -1, ikisi birbirine eşitse de cevap 0 olacak.

Boş Kaynaştıran Operatör (Null Coalescing Operator)

Bu da ayrı bir tuhaf isimli bir operatör. Lakayıt tınlayan bir ismi var ama işleri çok kolaylaştırıyor.

Aşağıdaki koda bakalım:

<?php

if (isset($_POST['name'])){
    $name = $_POST['name'];
} else {
    $name = 'isimsiz';
}
?>

Bu şekilde gıcık gıcık satırlar yazmak yerine aynı işi tek satırda halledebiliriz:

<?php

$name = isset($_POST['name'] ?? 'isimsiz';

?>

Operatör iki değişken arasında birinci null değilse birinciyi, eğer birinci null ise ikinciyi döndürecek.

Daha sağlam veri tipi işlemleri

Önceden belirlenmiş veri tipine sahip parametreler

PHP süper, ultra, harika esnek bir dil olduğundan, hızlıca kod yazabiliyorduk. Yani bir değişkenin, sayı mı, dizi mi yoksa metin mi olduğunu önceden belirlememize gerek yoktu. Ama şöyle bir kod bloğunu yazdığımızı düşünün.

<?php

namespace MidoriKocak;

class Features
{
    public function sortAnArray($array) {
        return sort($array);
    }
}

sortAnArray() metodunda her zaman parametre olarak dizi almamız gerekiyor. Ancak hiç bir denetim yapmadığımızdan, parametre olarak sayı ya da metin gelebilir. Kodumuzun doğru çalışması için bunu önlemek isteriz. PHP 5 sürümünde parametrelerin veri tipini belirliyorduk ve eğer bu veritipinden farklı bir veri tipine sahip bir değişken gelirse PHP yorumlayıcısı interpreter bir hata döndürüyordu. PHP 7 sürümünde ise TypeError tipinde bir ististna Exception fırlatıyor ki biz de try-catch blokları içinde bu hatalara göre tepki verebilelim.

<?php

namespace MidoriKocak;

class Features
{
    public function sortAnArray(array $array) {
        return sort($array);
    }
}

Ayrıca PHP 7’de int, float, string ve bool türünde parametre tipi belireleyebiliyoruz.

Önceden belirlenmiş veri tipini döndüren metodlar

PHP’de bütün metodlar return komutu tanımlamasak bile null yani boş veri tipi döndürürler ve asla null‘a güven olmaz.

Ek bilgi: https://www.ibuildings.nl/blog/2016/01/programming-guidelines-php-developers-part-2-getting-rid-null

PHP 7 ile gelen asıl yenilik ise, artık metodlarımızın return komutu ile döndüreceği veri tiplerini önceden belirleyebiliyor olmamız. Bu sayede kodumuz bizim istediğimiz değer dışında bir değer döndürürse yine TypeError tipinde bir istisna döndürecek.

<?php

namespace MidoriKocak;

class Features
{
    public function sortAnArray(array $array):array {
        return sort($array);
    }
}

İpucu: Siz yine de interface yani arayüz tanımlamayın ve bu kuralları orada da yazın. Bu sayede kullandığınız ide ve PHP yorumlayıcısı dikkat etmezseniz yaparsanız sizi uyaracaklar.

Anonim Sınıflar

Anonim metodları JQuery bölümünde JavaScript ile baya kullandık. Aynı yapı PHP 5 ve üzeri sürümlerde de mevcut. Bunlar biraz kafası olmayan yaratıklara benziyorlar ama yine de çok kullanışlılar. Annonim metodlar tek seferlik, genellikle bir olaya tepki vermek üzere yazılan metodlardır. Anonim sınıflar ise yine tek kullanımlık, sadece bir sefer kullanılıp atılacak metodlardır. php.net’teki örneği inceleyelim. http://php.net/manual/en/language.oop5.anonymous.php

<?php

// PHP 7+ code
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});
?>

Bu sayede değişik metodlara ve özelliklere sahip objeleri, sınıf tanımlaması yapmadan hızlı bir şekilde yaratabiliyoruz.

Daha kolay hata yönetimi

PHP 7 sürümünde yorumlayıcı interpreter hatası olan bir çok hata, istisna Exception haline getirilmiş. Örneğin yukarıda değindiğimiz TypeError gibi. İstisnalar yani Exception‘lar yakalanıp dövülmezlerse, pardon gereken önlem alınmazsa kod çalışmaya devam etmeyecektir. Buna bir sonraki kitabımda uzun yer ayıracağım. Ama siz yine de try-catch nedir bir araştırsın.

Toplu kullanım bildirimi (Ne demekse ?)

PHP 5 sürümünde kullanmak istediğimiz diğer sınıfları use ifadesiyle çalğırıyorduk. Ancak her bir satır için tek tek use yazmamız gerekiyordu. Şimdi bunları toplu halde, tek bir use ifadesiyle çağırabiliyoruz.

<?php
// Pre PHP 7 code
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+ code
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};
?>

Yani demem o ki, gözünüzü seveyim namespace kullanın kodlarınızda. Tabii ki OOP yazacaksınız.

Kaynak: http://php.net/manual/en/migration70.new-features.php

64-Bit Desteği

Daha önceden Windows makinenize PHP kurduğunuzda 64-bit ve büyük dosya desteği alamıyordunuz. 64-bit PHP sadece Linux’çu geek arkadaşlarınız ve Mac sahibi zengin bebeler için mevcuttu. PHP 7 sayesinde Windows üzerinde de 64-bit ve büyük dosya desteğine sahipsiniz ama siz yine de Linux’a geçin bence.

Kaynaklar

  1. http://www.hongkiat.com/blog/php7/
  2. http://php.net/manual/en/migration70.new-features.php
  3. https://blog.feryn.eu/php-7-is-now-available-new-features-improvements/
  4. https://www.digitalocean.com/company/blog/getting-ready-for-php-7/