PHP 8 Gelen Yeni Özellikler

Yıllar içinde PHP’ ye bir çok yeni özellik geldi. Yeni gelen bu özelliklerle birlikte PHP daha güçlü, modern, stabil ve daha hızlı bir dil haline geldi. Bu yazıda PHP 8 İle gelen yeni özellikleri anlatacağım. PHP 8 versiyonu, 26 Kasım 2020 tarihinde kullanıma sunuldu.

1- JIT Derleyici

PHP 8 ile gelen en dikkat çeken yenilik JIT (just in time) derleyicidir(compiler). PHP 8 iki JIT derleme motoru sunar. Tracing JIT daha üstün özelliğe sahiptir.

JIT, OPcache’ in nerdeyse bağımsız bir parçası olarak implemente edildi. JIT çalışma mekanizması; kodun monitör edilerek sık kullanılan bölümlerin bytcode olarak derlenmesi ve çalışma anında bu derlenmiş kısımların çalıştırılmasıdır.

PHP 8 performans metrikleri (kinsta.com)

JIT, OPcache’ in bir parçası olduğu için OPcache‘ in etkinleştirilmesi gerekir.Bunun için php.ini dosyasında opcache.enable=1 olarak ayarlamamız gerekiyor. Daha sonra JIT’ i aktifleştirmek için  opcache.jit_buffer_size=1024M şeklinde bellek ayırmamız gerekmektedir. Bunun varsayılan değeri 0, yani JIT compiler devre dışı olarak gelmektedir. Etkin olup olmadığından emin olamıyorsanız opcache_get_status fonksiyonunu kullanarak kontrol edebilirsiniz.

2- Çoklu Tip Tanımlama(Union Types)

PHP 8 ile birlikte değişkenlerde, fonksiyonlarda ki parametre tanımlamalarında ve fonksiyon dönüş tipi tanımlamalarında çoklu tip tanımlamasına izin veriyor.

class Product
{
    protected int|float $price; 
  
    public function setPrice(int|float $price): void 
    {
        $this->price = $price;
    }
    public function getPrice(): int|float 
    {
        return $this->price;
    }
}

3- Nullsafe Operatörü

Null safe operatörü ile zincir metodlarında null kontrolü ? operatörü ile birlikte daha kolay kontrol edebiliriz. Eğer bir metod null değer döndürürse işlem durduruluyor.

$country = $session?->user?->getAddress()?->country;

4- Eşleşme İfadesi (Match Expression)

PHP 8, swich case ifadesinin daha kısa ve daha basit bir yapısı match ifadesi ile birlikte geliyor. İşlem sonucu bir değişkene atanabilir veya geri döndürülen değer kullanılabilinir.

/* PHP 8 */
switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result; 
//ÇIKTI: Oh no!
/* PHP 8 */
echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//ÇIKTI: This is what I expected

5- Metin ve Sayı İfadelerin Karşılaştırılması

PHP 8′ de eğer sayısal değer bir metinle karşılaştırılıyorsa sayısal değer metne çevrilerek karşılaştırılır. PHP8′ de, PHP7 de olan 0 değerinin “” boş string kabul edilmesi veya 123 == “123abc” karşılaştırmasının false yerine true değer döndürmesi gibi tutarsızlıkların önüne geçiliyor.

PHP7
0 == 'foobar' // true

PHP8
0 == 'foobar' // false

6- İsimlendirilmiş Argümanlar(Named Arguments)

Bir metod ya da fonksiyonun zorunlu parametrelerini belirtip opsiyonel olanları atlayabiliyoruz. Örneğin 9 tane parametre alan bir fonksiyonda ilk 2 parametre zorunlu diğerleri opsiyonel olsun. Eğer opsiyonel olan parametrelerden sadece 9. olana değer göndermek istersek fonksiyona gönderilecek değeri ismi ile birlikte gönderiyoruz.

Ayrıca gönderilecek parametreleri isimleri ile tanımlarsak istediğimiz sırada gönderebiliriz.

function foo(string $a, string $b, ?string $c = null, ?string $d = null) 
{ /* … */ }

foo(
    b: 'value b', 
    a: 'value a', 
    d: 'value d',
);

7- Yapıcı Değişkenlerin Tanımlanması (Constructor property promotion)

PHP 8 ile birlikte bir sınıfın değişkenlerine yapıcı(constructor) metod ile değer atamak daha kolay.

/*PHP 7*/
class Point {
  public float $x;
  public float $y;

  public function __construct(float $x = 0.0, float $y = 0.0) {
    $this->x = $x;
    $this->y = $y;
  }
}
/*PHP 8*/
class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
  ) {}
}

7- Attributes V2

Java’ da annotation, JavaScript ve python ‘da decorator olarak adlandırılan ve sınıflara, metodlara, fonksiyonlara ve değişkenlere meta verisi tanımlamak için kullanılan bir özellik artık PHP8 ‘de de bulunuyor.

<<ExampleAttribute>>
class Foo
{
	<<ExampleAttribute>>
	public const FOO = 'foo';

	<<ExampleAttribute>>
	public $x;

	<<ExampleAttribute>>
	public function foo(<<ExampleAttribute>> $bar) { }
}

$object = new <<ExampleAttribute>> class () { };

<<ExampleAttribute>>
function f1() { }

$f2 = <<ExampleAttribute>> function () { };

$f3 = <<ExampleAttribute>> fn () => 1;

8- Dahili Fonksiyonlar için Tutarlı Tip Hataları(Consistent type errors for internal functions)

PHP fonksiyonları artık daha tutarlı hata mesajları veriyor.

/**PHP 7*/
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
/*PHP 8*/
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

9- Diğer Özellikler

str_contains() : Bir string ifadenin içinde başka bir string ifade bulunup bulunmadığını kontrol eder boolean değer döndürür.

str_contains ( string $haystack , string $needle ) :
str_contains("PHP is awesome", "PHP") // Çıktı : true 

str_starts_with() :Bir string ifade içinde başka bir string ifade ile başlayıp başlamadığını kontrol eder boolean değer döndürür.


str_ends_with(): Bir string ifade içinde başka bir string ifade ile bitip bitmediğini kontrol eder boolean değer döndürür.


get_debug_type(): get_debug_type() daha önceden kullandığımız gettype() ile aynı işi yapıp bize değişkenin türünü döndürüyor

Aşağıdaki tablo incelendiğinde arasındaki farklar daha net anlaşılacaktır.

TipÖrnek Değergettypeget_debug_type
Integer123integerint
Float3.14doublefloat
Booleantruebooleanbool
Booleanfalsebooleanbool
String'Foo'stringstring
Array[1, 2, 3]arrayarray
NullnullNULLnull
Sınıfnew Foo\Bar()objectFoo\Bar
Sınıfnew DateTime()objectDateTime
Anonim Sınıfnew class {}objectclass@anonymous
Anonim Sınıfnew class extends Foo {}objectFoo@anonymous
Closurefunction() {}objectClosure
Streamtmpfile()resourceresource (stream)
Curlcurl_init()resourceresource (curl)
Xmlxml_parser_create()resourceresource (xml)

fdiv() : Bu fonksiyon sıfıra bölmeye izin veriyor

fdiv(1, 0); // float(INF)
fdiv(-1, 0); // float(-INF)

mixed type : PHP8′ de mixed türünde tip tanımlaması yapılabiliniyor ve aşağıdaki tiplerin yerine geçiyor.

array|bool|callable|int|float|null|object|resource|string
public function foo(mixed $value) {}

parametre listelerinde sonda virgül: Bir fonksiyon tanımlarken son parametreye virgül konulabiliniyor.

public function foo(
		string $x,
		float $z, // trailing comma
	) {
		// do something
	}

::class obje üzerinde kullanma : Daha önce get_class() şeklinde olan kullanım artık $foo::class ile de mümkün ve aynı sonucu veriyor..

$foo = new Foo();

var_dump($foo::class);

Başarılar …