Ho’sh, qanaqa o’zgarishlar bor?
Nomli argumentlar
// PHP7 htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); // PHP 8 htmlspecialchars($string, double_encode: false);
- Faqat kerakli parametrlarni ko’rsatib, majburiy bo’lmaganlarini tashlab keting
- Argumentlar tartibi muhim emas
Atributlar
// PHP 7 /** * @Route("/api/posts/{id}", methods={"GET", "HEAD"}) */ class User { } // PHP 8 #[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] class User { }
PHPdoc annotatsiyalari o’rniga endi phpning annotatsiyalarini ishlatishiz mumkin. Bu narsa ayniqa Symfony freymvorkida ishlaydigan dasturchilarga qo’l keladi.
Konstruktorda xususiyatlarni e’lon qiling
// PHP 7 class Point { public float $x; public float $y; public float $z; public function __construct( float $x = 0.0, float $y = 0.0, float $z = 0.0, ) { $this->x = $x; $this->y = $y; $this->z = $z; } } // PHP 8 class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) {} }
Mening eng ko’p kutgan o’zgarishlarimdan biri. Endi dependency injection loyihalashtirish qolipini ishlatish yanada osonlashadi
Union turlari
// PHP 7 class Number { /** @var int|float */ private $number; /** * @param float|int $number */ public function __construct($number) { $this->number = $number; } } new Number('NaN'); // Xato yo'q // PHP 8 lass Number { public function __construct( private int|float $number ) {} } new Number('NaN'); // TypeError
Endi parametrlaringiz bir necha hil turga ega bo’lishi mumkin. Shaxsan men bu narsaga qarshiman, endi yomon kod yozuvchilar yanada ko’payadi
Match ifodasi
// PHP 7 switch (8.0) { case '8.0': $result = "О, yo'q!"; break; case 8.0: $result = "Men kutgan natija"; break; } echo $result; //> О, yo'q! // PHP 8 echo match (8.0) { '8.0' => "О, yo'q!", 8.0 => "Men kutgan natija", }; //> Men kutgan natija
Bu yangi ifoda switch ga o’xshaydi, lekin quyidagi farqlari bor:
- Match — bu ifoda va uning javobini biror o’zgaruvchanda saqlash mumin.
- Match’ning shartlari faqat bir qatordan iborat bo’lishi mumkin va break ishlatilmaydi
- Match qat’iy solishtirishni ishlatadi
Nullsafe operatori RFC
// PHP 7 $country = null; if ($session !== null) { $user = $session->user; if ($user !== null) { $address = $user->getAddress(); if ($address !== null) { $country = $address->country; } } } // PHP 8 $country = $session?->user?->getAddress()?->country;
Yana bir ko’p kutilgan o’zgarish. Agar kodimiz zanjirida null bo’lsa, kod davom etmaydi va ifoda javobi null ga teng bo’ladi.
Qator va sonlarni tekshirish yaxshilandi
// PHP 7 0 == 'foobar' // true // PHP 8 0 == 'foobar' // false
Just-In-Time (JIT) kompilyatsiyasi
PHP 8 yangi JIT kompilyatsisani taqdim etadi. Umaman bu dasturchilarga ko’rinmasada, eng asosiy o’zgarish hisoblanadi. Buning uchun PHP yadrosi qayta yozib chiqildi. Endi PHP 3 barobargacha tezroq ishlaydi
Relative JIT contribution to PHP 8 performance
Va juda ko’p boshqa o’zgarishlar bo’ldi, shulardan:
- Trait’larda abstrakt usullar RFC
- @ operatori endi Fatal hatolarga taasir qilmaydi
- Yangi mixed turi RFC
- Yangi static qaytarish turi RFC
- cURL da resource o’rniga obyektlar RFC
- Parametrlar ro’yxati ohirida vergul ruhsat etildi
- Endi catch blokida o’zgaruvchan bo’lishi shart emas RFC
- Endi obb=yektlarning sinfini olish uchun ham ::class ishlatsa bo’ladi RFC
- Yangi Stringable interfeysi o’shildi
- Va ko’plab boshqa ozgarishlar
Akmal aka salom. PHP 8 haqidagi maqolangizni o’qidik. Iltimos PHP 5.6 va PHP 7 ning farqlari haqida ham ma’lumot bersangiz. Katta yoshdagi dasturchilar hali ham PHP 5.6 da ishlayapti. Bir oz Qiynalayapmiz ayniqsa MySQL da. Raxmat