قابلیت های php نسخه ای 8 و اتفاق بزرگی به نام JIT


در این پست تمام ویژگی ها و تغییرات ورژن php 8 را بررسی می کنم . یکی از هیجان انگیز ترین ویژگی آن JIT هست که ادامه توضیح خواهیم داد.

چند ماه پیش php نسخه 8 را منتشر کرد که در نسخه ای جدید یک سری ویژگی های خیلی خوب اضافه شده که باعث بهبود سرعت اجرای برنامه می شود.

(Just In Time Compilation)JIT چیست؟

همان طور که می دانید php یک زبان مفسری هست یعنی برای اجرای برنامه نیاز به کامپایل کردن یا همون خروجی گرفتن مثل زبان های دیگری مثل Java و یا ++C نیست. یعنی همان لحظه که برنامه اجرا می شود کامپایل می شود و خروجی رو نمایش می دهد اما در نسخه 8 پی اچ پی JIT را به موتور ترجمه خود اضافه کرده که باعث شده هم سرعت اجرا برنامه ها کمتر شود و هم از منابع کمتری برای اجرای برنامه ها استفاده کند. با این قابلیت در های جدیدی بر روی Php باز شده است مثلا در آینده شاهد این باشم که از Php در هوش مصنوعی هم استفاده کنند.

در تصویر زیر هم که خود سایت php گذاشته مشاهده می کنید JIT چقدر تاثیر داشته در اجرای برنامه ها


دیگر ویژگی های PHP 8 را مثال می زنیم و با نسخه ای PHP 7 مقایسه می کنیم

Named argument :

بعضی مواقع برای بعضی از توابع و یا کلاس لازم می شد که چندین پارامتر بفرستیم که بعضی هاشون اختیاری باشن تو نسخه 7 موقع فراخوانی توابع یا کلاس اگر می خواستم به پارامتر آخر یک مقداری رو پس کنیم (بفرستیم) مجبور بودیم که به اون پارامتر اختیاری که قبل از این پارامتر هست مقدار null بدیم که کار کند .اما در نسخه 8 این مشکلی خیلی خوب حل شده که در نمومه کد زیر قابل مشاهده هست .در واقع با قابلیت name arugument می داند که کدام مقدار را به کدام پارامتر بفرستد.

class  Blog
{
    public function __construct(
    private string $title,
    private  string|null  $description,
    private string $slug ) {}

}

//   PHP 7
$blog_object = new Blog (
    'New  Devcoach Post',
    '',
    'new-post',
);

// PHP 8
$blog_object = new Blog (
    title : 'New  Devcoach Post',
    slug: 'new-post',
);

Attributes ها :

جایگزین مناسب برای PHPDoc هست که در نسخه ای 8کد ها خیلی کمتر و خوانا ترم می کند.

// PHP 7
class PostsController
{
    /**
     * @Route(&quot/api/posts/{id}&quot, methods={&quotGET&quot})
     */
    public function get($id) { /* ... */ }
}


// PHP 8

class PostsController
{
    #[Route(&quot/api/posts/{id}&quot, methods: [&quotGET&quot])]
    public function get($id) { /* ... */ }
}

Constructor property promotion :

این اجازه را به ما می دهد که بتوانیم خصوصیات کلاس رو مستقیم داخل constructor تعریف و استفاده کنیم بدون اینکه بخوایم مانند نسخه 7 قبل از متد constructor این خصوصیات رو تعریف کنیم.

// PHP 7
class Blog {
    public string $title;
    public string $description;
    public string $slug;

    public function __construct(
        float $title = 'New Devcoach Post',
        float $description = 'This is a post',
        float $slug = 'new-post'
    ) {
        $this->title = $title;
        $this->description = $description;
        $this->slug = $slug;
    }
}

// PHP 8

class Blog {
    public function __construct(
        float $title = 'New Devcoach Post',
        float $description = 'This is a post',
        float $slug = 'new-post'
    ) {}
}

Union types :

یه سری خطا داخل پروژه ها به این خاطر پیش می آمد که پارامتر درست ارسال نشده بود چون بعضی مواقع نیاز بود یک پارامتر هم عددی باشد و هم اعشاری و این ویژگی نبود که هر دو نوع تایپ را تعریف کرد.union ها در نسخه ای جدید این مشکل را حل کردن و در های جدیدی برای تعریف متد و فانکشن باز کردند.

// PHP 7
class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}

new Number('NaN'); // Ok

// PHP 8

class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number('NaN'); // TypeError

Match expression :

به طور خلاصه این جایگزین خوب و کوتاه تر برای swicth ها هست که طبق نیازمون می توانیم ازش استفاده کنیم و در ضمن می توان مقدار پیش فرض مثل swicth ها براش تعریف کرد

// PHP 7

switch (8.0) {
    case '8.0':
        $result = &quotOh no!&quot
        break;
    case 8.0:
        $result = &quotThis is what I expected&quot
        break;
    default:
        $result = 'nothing';
}
echo $result;

// PHP 8

echo match(8.0){
'8.0' => &quotOh no!&quot,
  8.0 => &quotThis is what I expected&quot,
    default => 'nothing'
};

Nullsafe operator :

به نظرم بعد از JIT یکی از اتفاق های خوب php نسخه ای 8 هست که انجام شده .در نسخه 7 php من همیشه این مشکل رو داشتم ، یک خطای به خاطر null بودن object رخ داده مخصوصا در لاراول که اکثرا در پروژه ها استفاده می کنم همیشه مسئله بوده که با شرط if بررسی کنم اگر خالی نبود مقدارشون نمایش بدم. قطعا با ویژگی ساختار کد ها خیلی تمیز تر ، کمتر و در کنار این همه قابلیت به نظرم تعداد خطای برنامه ها هم خیلی کم تر می شود.

// 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;

Saner string to number comparisons :

در php 8 برای مقایسه یک عدد با رشته از مقایسه اعداد استفاده می کند .

// PHP 7

0 == 'foobar' // true

// PHP 8
0 == 'foobar' // false

یک سری توابع و کلاس جدید هم در php نسخه ای 8 اضافه شده که به شرح زیر هست:

1.str_contains
2.str_start_with
3.str_ends_with
4.get_debug_type

// PHP 8

 str_contains ( string $haystack , string $needle ) : bool
Example:
str_contains('This is my first blog', 'blog') // true

str_starts_with (string $haystack , string $needle) : bool
Example:
str_starts_with('This is my first blog post', &quotis&quot) // false

str_ends_with (string $haystack , string $needle) : bool
// Example:
str_ends_with('This is my first blog post', &quotpost&quot) // true 

$bar = $arr['key'];
if (!($bar instanceof Foo)) { 
  // this shows the most simple of patterns, to get the real type an assoc array
  // must be present to convert long-form &quotinteger&quot into int etc.
  throw new TypeError('Expected ' . Foo::class . ' got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));
}
 
// would become
if (!($bar instanceof Foo)) { 
  throw new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));
}
 
$bar->someFooMethod();


class FooBar {
    private WeakMap $cache;
 
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
 
    // ...
}

و در آخر من شخصا خیلی هیجان زده شدم از قابلیت و ویژگی های نسخه 8 مخصوصا با JIT و Nullsafe که واقعا ویژگی خوبی بودن . امیدوارم تونسته باشم که اکثر ویژگی ها رو با زبان ساده تو این مقاله ارائه بکنم.


منبع