مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

معرفی قابلیت های PHP 8 | بررسی 7 قابلیت جدید در PHP

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

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

آرگومان های نام دار

در PHP ورژن 8 می توانید در فراخوانی یک تابع آرگومان های اختیاری را نادیده بگیرید و فقط از آرگومان هایی استفاده کنید که نیاز است. به این صورت که در قرار دادن پارامتر ها ترتیب اهمیتی ندارد و می توانید هرکدام را با نامشان مقداردهی کنید مانند مثال زیر:

نسخه 7

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

نسخه 8

htmlspecialchars($string, double_encode: false);

مقداردهی به پارامترهای constuctorها

شما می توانید با نوشتن کد بسیار کمتر خصوصیات را در کلاس تعریف کنید و آنها را در constructor مقدار دهی کنید مانند مثال زیر

نسخه 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;
  }
}

نسخه 8

class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

اجتماع گرفتن از نوع پارامترها

در PHP نسخه 8 برخلاف بعضی از نسخه های قبلی می توانید نوع پارامتر را مشخص کنید و چیزی که در این نسخه اضافه شده است می توانید یک پارامتر را از چند نوع تعریف کنید به صورتی که نوع داده ها را با هم اجتماع کنید. دقت داشته باشید که نوع داده مشخص شده مانند phpDoc Annotation نیست که حالت کامنت داشته باشد و زمان اجرا بررسی می شود. مثل کد زیر

نسخه 7

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

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

new Number('NaN'); // Ok

نسخه 8

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

new Number('NaN'); // TypeError

اضافه شدن عبارت Match

در PHP ورژن 8 دستور جدیدی به نام match برای ارزیابی عبارت ورودی تعریف شده است که عمل تصمیم گیری مانند switch را انجام می دهد. تفاوتی که دارد این است که match یک عبارت است که یک مقدار را برمی گرداند که می توان این مقدار را در متغیر نیز ذخیره کرد. همچنین مقایسه ای که match انجام می دهد دقیق تر است. Match نیازی به دستور break ندارد. مثالی از این دستور را در کد زیر می بینید.

نسخه 7

switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!

نسخه 8

echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

عملگر بررسی null بودن

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

نسخه 7

$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

نسخه 8

$country = $session?->user?->getAddress()?->country;

بهبود مقایسه رشته با عدد

در PHP نسخه 8 وقتی که یک رشته را با عدد مقایسه می کنیم ابتدا PHP سعی می کند که رشته را تبدیل به عدد کند و مقایسه کند و اگر نتوانست عدد را تبدیل به رشته کرده و مقایسه رشته ای انجام می دهد.

نسخه 7

0 == 'foobar' // true

نسخه 8

0 == 'foobar' // false

بروز خطای نوع در توابع داخلی

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

نسخه 7

strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0

نسخه 8

strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

یک بهبود دیگر در PHP نسخه 8 استفاده از Jit برای بالا بردن سرعت  و کارایی است که طبق benchmark ها در مواردی سرعت و کارایی را بالا برده است. اطلاعات بیشتر

با وب سایت tosinso همراه باشید.

نویسنده: مهدی عادلی فر


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات