PHP 8 ile Gelen Yenilikler
PHP'nin 8.0.0 sürümü 3 eylül'de test için duyuruldu. Yani artık kurup PHP 8 ile birlikte gelen yenilikleri deneyebilir ve diğer testlerimizi yapabiliriz. Bununla birlikte hali hazırda şu an eklenen yeniliklere https://wiki.php.net/rfc adresinden bakabilirsiniz.
Ben de sizler için yeni gelen birkaç değişiklikten yazılı olarak bahsetmeye çalışacağım.
str_contains()
fonksiyonu
Bu fonksiyon bir değer içerisinde aradığımız değer olup olmadığını kontrol ediyor. Bunu hali hazırda uzun zamandır yapan strpos()
ve strstr()
fonksiyonları olsada, bir çoğu projesinde bunu str_contains()
ismiyle ayrıca adlandırıyormuş ve buna istinaden bu durum için özel bir fonksiyon olması gerektiğini önermişler. Ve kabul görüp 8. sürüme eklenmiş.
str_contains("abc", "a"); // true
str_contains("abc", "d"); // false
Tek sıkıntısı büyük-küçük harf duyarlılığı var, yani case-insensitivity olayı yok, gelecekte belki eklenebilir demişler ama yapmışken barı tam yapaydınız :D
Dizilerin negatif değerle başlaması
Normalde negatif değerle başlayan bir dizi oluşturduğunuzda alacağınız sonuç şudur;
$array = [-3 => "hello", "a", "b", "c"];
print_r($array);
/*
Array
(
[-3] => hello
[0] => a
[1] => b
[2] => c
)
*/
Ancak artık negatif değerle başlıyorsa ona göre artarak devam ediyor. Yani;
$array = [-3 => "hello", "a", "b", "c"];
print_r($array);
/*
Array
(
[-3] => hello
[-2] => a
[-1] => b
[0] => c
)
*/
Çoklu Tür Kullanımı (Union Types)
Bunu daha öncede tartışmışlardı ancak kabul edilmemişti. Yeniden hazırlanıp 2. versiyonuyla kabul görmüş. Tür belirttiğimiz her yerde çoklu tür de belirtebiliyoruz artık.
Örneğin bu olmadan önce hem int
hem de float
kabul eden bir işlemi şöyle belli etmek gerekiyordu;
class Number
{
/**
* @var int|float $number
*/
private $number;
/**
* @param int|float $number
*/
public function setNumber($number)
{
$this->number = $number;
}
/**
* @return int|float
*/
public function getNumber()
{
return $this->number;
}
}
Neden? Çünkü çoklu olarak türü belirtemediğimiz için ve 2 türü desteklediğimiz için type hint yapamıyorduk yine. Ancak artık bunu şu şekilde kullanabiliyoruz.
class Number
{
private int|float $number;
public function setNumber(int|float $number) : void
{
$this->number = $number;
}
/**
* @return int|float
*/
public function getNumber() : int|float
{
return $this->number;
}
}
str_starts_with()
ve str_ends_with()
fonksiyonları
Belirlediğimiz değerle başlayan ya da bitenleri kontrol etmek için bu 2 fonksiyon eklendi. Bu işlev için bir çok popüler php framework'ü daha önceleri kendileri bu isimde yardımcı fonksiyonlar sunuyorlarmış ve sonuç olarak PHP 8'de eklenmiş oldu. Ancak bunda da büyük-küçük harf duyarlılığı var.
$str = "prototurk.com";
if (str_starts_with($str, "pro")) echo "doğru yerdesin aslan!";
if (str_starts_with($str, "Pro")) echo "büyük-küçük sıkıntı :/";
if (str_ends_with($str, ".com")) echo "bir web sitesi.";
if (str_ends_with($str, ".Com")) echo "büyük-küçük yine sıkıntı :/";
Nullsafe (?->) Operatörü
Adındanda anlaşılacağı üzere null değeri kontrol edip ona göre işlem yapan operatör. Örneğin şöyle bir kod parçanız olsun;
if ($user != null){
$country = $user->getCountry();
}
Burada $user
değişkenini kontrol edip varsa içinden bir metodu $country
değişkenine atıyoruz. Bunun gibi iç içe birkaç tane daha olabilirdi. Bu yeni operatörle ise şu şekilde kullanabiliyoruz;
$country = $user?->getCountry();
Eğer ?->
öncesinde değer null ise sonrasında çağırılan getCountry()
metodu çağırılmadan işlem sonlanacaktır.
Adlandırılmış Parametreler
Normalde bir fonksiyonu ya da metodu çağırırken parametre sırasına göre yazmamız gerekiyordu. Örneğin php'de cookie oluştururken setcookie()
fonksiyonunu kullanıyoruz. Ben httpnoly
cookie oluşturmak isteseydim şöyle yazmak zorundaydım;
setcookie('test', 'test', 0, "", "", false, true);
Çünkü 7. parametrem bununla ilgiliydi ve diğerlerini mecburen belirtmem gerekiyordu. Ancak artık parametre adını kullanarak diğerlerini es geçebiliyorum. Yani şöyle yazabilirim;
setcookie('test', 'test', httponly: true);
match() Fonksiyonu
switch
yapısına alternatif olarak sunulmuş. switch'e göre hem daha kısa yazıyorsunuz hem de daha okunaklı kod oluyor. Örneğin;
switch (2) {
case 1:
$result = "Sonuç 1";
break;
case 2:
$result = "Sonuç 2";
break;
default:
$result = "Sonuç yok";
break;
}
echo $result;
Tabi burada bazen break'i koymayı unutabiliyoruz vs. Bunu yeni match()
fonksiyonu ile şöyle yapıyoruz.
$result = match(2) {
1 => 'Sonuç 1',
2 => 'Sonuç 3',
default => 'Sonuç yok'
};
Şimdi elini vicdanına koy ve söyle, hangisi daha iyi? :D Kesinlikle match()
güzel düşünülmüş.
Contruct'da Özellik Tanımı
Sınıflarda __construct()
metodunda özellik tanımı yapılırken kendini sürekli tekrar eden bir yapı oluşuyor. Örnek vermek gerekirse;
class User
{
private string $name;
private int $age;
public function __construct(string $name = 'Bilinmiyor', int $age = 0)
{
$this->name = $name;
$this->age = $age;
}
}
Bunu bu şekilde uzun uzun yapmak yerine artık PHP 8'de kurucu metodda işi çözüyoruz.
class User
{
public function __construct(
public string $name = 'Bilinmiyor',
public int $age = 0
) {}
public function getName(){
return $this->name;
}
}
$user = new User('Tayfun Erbilen', 28);
echo $user->getName(); // Çıktı: Tayfun Erbilen