PHP 8.0 chiqarildi!

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
58+

PHP 8.0 chiqarildi!” ga 1 fikr qoldirilgan

  1. MrKurbanov

    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

    39+

Fikr bildirish