Giri┼č yap

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