تغییرات جدید PHP 8

تغییرات جدید PHP 8

به تازگی آخرین نسخه از ۴ نسخه بتای PHP 8 منتشر شده است، و این در حالی است که انتظار می رفت محصول نهایی در ۲۶ نوامبر یا ۶ آذر منتشر شود. در ادامه به بررسی ویژگی های جدید PHP 8 می پردازیم.


 

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


استفاده از Union Typeها

این ویژگی اشاره ای است به static typing در حالی که از طبیعت پویای این زبان نگهداری می کند. Unionها اجازه دریافت چندین نوع را می دهند، چه برای داده های ورودی و چه برای خروجی ها. تا به حال syntax زبان این اجازه را به ما نمی داد که از unionها استفاده کنیم و این مشکل معمولا با استفاده از حاشیه نویسی (annotation) برطرف می شد.

تعریف نوع void در بین نوع های بازگشتی غیر قابل قبول است، به این دلیل که این نوع مشخص کننده تابعی است که هیچ مقداری را برگشت نمی دهد. در حالی که می توانیم به سادگی مقدار null را بدهیم تا به مقادیر قابل null  شدن اشاره کنیم.


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

این مشکلی است که بسیاری از برنامه نویسان PHP به آن برخورده اند، در زمانی که باید از روشهایی یا توابعی که دریافت می کنند استفاده کنند گزینه های  آرگومان بیشتری دارند که بسیاری از آنها دارای مقادیر اولیه هستند. آرگومانهای نام گذاری شده (Named Arguments) به ما اجازه عبور یک پارامتر را با توجه به نام آن می دهد، به جای اینکه ترتیب مشخص کننده این مورد باشد.

شناساندن خصوصیت Constructor

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

خصوصیات (Attributes)

برخی آنها را با نام annotation یا حاشیه نویسی می شناسند، که تا به حال تنها برای شکل دهی به کامنت ها استفاده می شد. در نهایت آنها پروموت شدند تا بخش رسمی و واقعی از این زبان باشند. بعد از کش و قوسهای بسیاری بر سر اینکه حاشیه نویسی ها چگونه مشخص شوند، دو علامت انتخاب شد برای شروع، همراه با یک علامت به عنوان علامت پایانی.

Match Expression

شاید نام این عملکرد طوری به نظر برسد که گویا رابطه ی خاصی با عبارات (expressions) معمول دارد، این مورد بیشتر شبیه به دستور Switch است. به وسیله این مکانیزم، توسعه دهندگان قادر خواهند بود مقادیر را بر پایه پارامترهای ورودی را برگردانند، بدون استفاده از هرگونه کلیدواژه اضافی، مانند:  break,return.

همچنین به عنوان ویژگی جدید، Match از strong typing برای مقایسه مقادیر(شبیه به استفاده از === در عبارت مقایسه ای)، و اگر با هیچ کدام از مقادیر برابر نبود به صورت پیش فرض UnhandeledMatchError  خروجی خواهد بود.

JIT  (تنها در تایم کامپایلر)

مکانیزمی که برای آزمایش از PHP 7.4 قابل استفاده بود، در نهایت به صورت رسمی عرضه خواهد شد. JIT کارایی خاصی دارد، بدین صورت که دستورات را فورا قبل از اجرا در ماشین کامپایل می کند. به عنوان مثال، این ویژگی امکانی فراهم می کند که کد اپلیکیشن را اصطلاحا (در حال پرواز) اجرا کند، سریعتر از یک مفسر سنتی. می توان این را با coaching code که در حال حاضر تفسیر شده است مقایسه کرد.

در دنیای PHP، قبل از انتشار PHP 8، توسعه دهندگان به دنبال افزایش کارایی بودند اما بدون استفاده از JIT. اما پس از اینکه هیچگونه پیشرفتی حاصل نشد به سراغ توسعه دهندگان Facebook رفتند و از راه حلهای آنها استفاده کردند(HHVM و Hack).


دیگر ویژگی های جدید

در میان موارد جدیدی که PHP 8 برای ما عرضه می کند، کمی بیشتر امکاناتی می یابیم که برای کسب و کارهای جدید جذاب هستند:

  •     Nullsafe operator
        Static
        Mixed
        WeakMaps
        using the magic ::class method on objects
        trailing comma
        بررسی استثناها بدون نیاز به واگذار کردن آنها به یک متغییر
        new Stringable interface
        validation of abstract methods derived from traits


    علاوه بر تغییرات سینتکس که به آنها اشاره شد، عرضه PHP 8 برخی از ویژگی های مفید جدید را نیز به آن اضافه کرده است. برخی از این ویژگی های جدید می توانند به میزان زیادی باعث راحت تر شدن کد نویسی های روزانه شما شوند.

     
    str_contains()
    

     

این تابع قابلیت بررسی رشته ی ورودی شما را در پس زمینه دارد و دیگر نیازی به استفاده از تابع strops نخواهید داشت.

 
str_starts_with() and str_ends_with()


هر دو تابع درست همانند هم عمل می کنند و بررسی می کنند که رشته با مقدار خاصی شروع شده و یا پایان یافته است.

 
get_debug_type()


این تابع در عمل تابع gettype() را بسط می دهد. بجز آن این تابع دقیقا همان مقداری را بازگشت می دهد که در کد مشخص شده است

 

 

تغییرات عمومی


در PHP 8 قدم رو به جلوی بسیار خوبی برای افزایش شفافیت در همه موارد برداشته شده است تا دیگر پیچیدگی های غیر ضروری و همچنین موارد غیر قابل پیش بینی زمان شما را نگیرد، تغییرات مهمی مانند بازگشت استثناهای TypeError و ValueError برای embedded functions و برخی تغییرات دیگر.

در ادامه توابع create_function() و each() حذف شدند در حالی که مکانیزم توابع دیگر مانند array_key_exists() و define() تغییر کرد.
همچنین تغییرات مهمی در مکانیزم پیشفرض بررسی خطا و نمایش ایجاد شد. مقدار اولیه برای گزارش خطا E_ALL خواهد بود و اپراتور @ دیگر خطاهای بحرانی را پنهان نمی کند.

 

نتیجه گیری


نسخه ۸ PHP قطعا قدم رو به جلویی به حساب می آید. این نسخه زبان PHP را تمیز تر از گذشته کرده و با انتشار آن بسیاری از ویژگی هایی که مدتها در انتظار آنها بودیم را عرضه کرده است.