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.
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ğer | gettype | get_debug_type |
---|---|---|---|
Integer | 123 | integer | int |
Float | 3.14 | double | float |
Boolean | true | boolean | bool |
Boolean | false | boolean | bool |
String | 'Foo' | string | string |
Array | [1, 2, 3] | array | array |
Null | null | NULL | null |
Sınıf | new Foo\Bar() | object | Foo\Bar |
Sınıf | new DateTime() | object | DateTime |
Anonim Sınıf | new class {} | object | class@anonymous |
Anonim Sınıf | new class extends Foo {} | object | Foo@anonymous |
Closure | function() {} | object | Closure |
Stream | tmpfile() | resource | resource (stream) |
Curl | curl_init() | resource | resource (curl) |
Xml | xml_parser_create() | resource | resource (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 …