
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