40 ویژگی جدید php 8
php 8 نسخه جدیدی از زبان برنامه نویسی php است که علاوه بر رفع ایرادات و نقص های ورژن های قبلی، ویژگی ها و امکانات متفاوتی را به ارمغان آورده است. در این مقاله قصد داریم تمام ویژگی ها و امکانات منحصر به فردی که درباره php 8 وجود دارد را معرفی کرده و بررسی نماییم.
آشنایی با ویژگی ها و امکانات php 8
در این بخش تعدادی از ویژگی ها و امکانات جدیدی که در php 8 وجود دارند را معرفی کرده و درباره هر یک از آنها اطلاعاتی را ارائه می کنیم.
1- کامپایلر JIT
JIT یا همان Just In Time، امکانی است که قرار بود آن را به php 7.4 اضافه نمایند اما بعدا بنا بر دلایلی نظرشان عوض شد و تصمیم به قرار دادن این ویژگی در نسخه php 8 گرفتند. همانطور که از اسمش مشخص است، وظیفه اصلی آن کامپایل کردن یا در واقع جمع آوری کردن تمام کدهای پروژه ما حین اجراست.
اما ممکن است برایتان سوال پیش بیاید که مگر کدهای php نیازی به کامپایل شدن دارند؟ پاسخ هم بله است هم خیر! چرا که php به صورت مستقیم نیاز به کامپایل کردن کدها ندارد، بلکه تحت فرمان OP cash یکبار کدها را خوانده و جمع آوری می کند و از آن به بعد فقط آنها را صدا می زند.
کاری که JIT انجام می دهد این است که هر زمان شما نیاز به اجرای کدهایتان پیدا کردید آن را به صورت Just In Time یعنی درست در همان زمان کامپایل کرده و به اجرا در می آورد. نه اینکه مانند گذشته فقط یکبار برای بار اول فراخوانی کدها آنها را جمع آوری کند.
2- اپراتور Nullsafe
اگر از فعالان و جزء با افراد با تجربه حوزه آی تی باشید، به احتمال زیاد قبلا با این اپراتور برخورد داشته اید و به خوبی می دانید که علامت معرف آن «؟؟» است.
همچنین به احتمال زیاد به خوبی می دانید که شما توسط اپراتور nullsafe قادر به صدا زدن یک متد نیستید. توسط nullsafe کاربر می تواند کدهای شرطی چند خطی را در یک خط قرار دهد و شرط را برقرار سازد.
3- Named Arguments
با وجود این ویژگی، کاربر برای مقداردهی به یک متغیر از یک تابع نیازی به مقداردهی به همه متغیرها آن هم به صورت مرتب ندارد. بلکه می تواند نام آن پارامتر را صدا زده و مقدار خود را برای آن ادیت نماید.
4- Attributes
Attribute ها روشی برای افزودن متا به کلاس های موجود در کد بدون نیاز به تجزیه DOCblock ها هستند. شما می توانید Attribute های مدنظر خود را با استفاده از روش هایی که در سایت های مقالات اختصاصی php 8 وجود دارند، آموزش دیده و یاد بگیرید.
5- Match Expression
در دنیای php به match expression به عنوان برادر بزرگتر Switch نگاه می کنند. دلیل این دیدگاه نیز وجود ساختار تکامل یافته و بهینه سازی شده سوئیچ در match expression در php 8 است. در match expression بر خلاف switch نیازی به استفاده از break نیست، می توانید Valueها را برگردانید و شرایط یا Condition ها را با یکدیگر ادغام کنید.
6- ارتقاء تابع Constructor
با استفاده از این ویژگی در php 8 دیگر نیازی به مقداردهی داده های مختلف در آکولادهای یک تابع نیست و تنها کافی است با استفاده از یک پرانتز داده ها را در تابع مقدار دهی کرده و تغییر دهیم.
7- نوع برگشت استاتیک جدید
شاید با دانشی که نسبت به php دارید با خود فکر کنید که چه نیازی به یک ویژگی یا امکان جدید برای return Type به صورت استاتیک است. اما این یک ویژگی از آن دسته امکاناتی است که php احتمال داد می تواند برای بسیاری از کاربرانش مورد استفاده واقع شود.
8- throw expression
در php 8 این امکان وجود دارد که با هر expression یک exception را throw کنید.
9- Mixed Type جدید
php 8 با این ویژگی خود به کاربر این امکان را می دهد که هر متغیری را با هر داده ای مقداردهی کند.
10- وارث شدن با روش های خصوصی
در نسخه هایی قبل از php 8 شیوه کار به این شکل بود که تمام بررسی های انجام شده بر روی متدهای محافظت شده یا عمومی بر روی متدهای خصوصی نیز انجام می شد. RFC در این شیوه تغییراتی اعمال کرده است که طی آن متدهای خصوصی مجبور به تبعیت از قوانین متدهای محافظت شده یا عمومی نیستند.
11- Weak maps
این قابلیت بروز رسانی شده در php 8 این امکان را به کاربر می دهد تا به آسانی از شر objectهایی که به هیچ منبعی متصل نیستند رها شود. در واقع weak map با شناسایی object هایی که به هیچ منبعی متصل نشده اند را شناسایی کرده و آنها را حذف می کند. این کار کمک می کند تا با کمبود حافظه و فضا مواجه نشویم و البته از پاک کردم object های بلا استفاده به صورت دستی یا روش های دیگر بر حذر باشیم.
12- امکان استفاده کلاس ها بر روی آبجکت ها
پیش از نسخه php 8 برای آنکه بدانیم یک آبجکت از چه کلاسی ساخته شده است باید از get_class استفاده می کردیم اما php 8 به ما این امکان را داده است تا فقط با نوشتن : : class بر روی آبجکت مورد نظر، کلاس مربوط به آن را بیابیم.
13- Non-capturing catches
در php 8 دیگر برای استفاده از exception نیازی به آوردن متغیر و انجام عملیات ذخیره سازی در آن ندارید.
14- کامای دنباله دار در لیست پارامترها
پیش از php 8 زمانی که یک عملکرد را صدا می زدید، باید کامای دنباله دار را در انتهای آن قرار می دادید. اما در php 8 دیگر نیازی به این کار نیست.
15- قابلیت ایجاد آبجکت های Date time از interface
یک راه جدید که php 8 برای ایجاد آبجکت های Date time با خود به ارمغان آورده است؛ به شرح زیر است:
1 2 3 |
DateTime::createFromInterface(DateTimeInterface $other); DateTimeImmutable::createFromInterface(DateTimeInterface $other); |
16- Interface رشته ای جدید
در php 8 هرگاه شما __tostring را اجرا می کنید، type hint به صورت خودکار برای آن اعمال می شود.
17- عملکرد جدید str_contains
کد مورد استفاده برای بررسی اینکه یک رشته شامل چه رشته ای می شود، به کمک این عملکرد بهینه سازی شده است.
در واقع به جای استفاده از:
1 |
if (strpos('string with lots of words', 'words') !== false) { /* … */ } |
از این کد استفاده می کنیم:
1 |
if (str_contains('string with lots of words', 'words')) { /* … */ } |
18- عملکردهای جدید str_starts_with و str_ends_with
این دو عملکرد به هسته php 8 افزوده شده اند:
1 2 3 |
str_starts_with('haystack', 'hay'); // true str_ends_with('haystack', 'stack'); // true |
19- عملکرد جدید fdiv
این عملکرد جدید، چیزی شبیه به fdiv() و fmod() است و تقسیم بر 0 را برای کاربر ممکن می سازد. در اینصورت دیگر خبری از خطاهای INF، -INF و NAN نیست.
20- عملکرد جدید get_debug_type()
این عملکرد جدید، انواع متغیر ها را برمی گرداند. این عملکرد برای برگرداندن آرایه ها، رشته ها، object ها و کلاس های anonymous مناسب است.
21- عملکرد جدید get_resource_id()
منابع، متغیرهای خاص php هستند که به منابع خارجی اشاره می کنند. برای مثال می توان اتصال My SQL یا file handle را نام برد. هر کدام از این منابع یک ID اختصاصی دارند که در نسخه های پیشین php تنها راه متوجه شدن آن، کد: $resourceId = (int) $resource; بود.
Php 8 این کد را بهینه سازی کرده و به شکل زیر درآورده است:
1 |
$resourceId = get_resource_id($resource); |
22- متدهای abstract در بهینه سازی trait ها
در php 8 ، trait ها می توانند متدهای ابسترکتی مشخص کنند که باید توسط کلاس هایی که از آن ها استفاده می کنند به اجرا در بیایند.
در حالی که پیش از نسخه php 8 مراحل زیر valid بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
trait Test { abstract public function test(int $input): int; } class UsesTrait { use Test; public function test($input) { return $input; } } |
23- پیاده سازی آبجکتِ token_get_all()
این عملکرد در php 8 آرایه ای از Value ها را بر می گرداند. این RFC یک کلاس PhpToken را همراه با متد PhpToken::getAll() اضافه کرده است. این اجرا توسط object ها کار می کند که به حافظه کمتری نیاز داشته و خواناتر است.
24- Variable syntax tweaks
سینتکس های متغیر RFC به طور یکسان قادر به حل ناسازگاری هایی در سینتکس های متغیر PHP هستند. این RFC قصد دارد، تعداد انگشت شماری از کلاس هایی که نادیده گرفته شده اند را مرتب کرده و آدرس دهی نماید.
25- خطای Fetal برای اثر متد ناسازگار
خطاهای وارث ناشی از اثر متد ناسازگار، بسته به علتی که منجر به بروز آنها شده است می توانند به خطاهای Fetal تبدیل شوند.
26- Stable sorting
پیش از php 8 الگوریتم های طبقه بندی شده، ثبات نداشته و ناپایدار بودند. پس در نتیجه دستور المان های برابر از هیچ تضمینی برخوردار نبودند. Php 8 تمام این طبقه بندی ها را به یک امر پایدار تبدیل کرده است.
27- تغییر اثر روش بازتاب
پیش از نسخه php 8، شکل زیر برقرار بود:
1 2 3 4 5 |
ReflectionClass::newInstance($args); ReflectionFunction::invoke($args); ReflectionMethod::invoke($object, $args); |
اکنون در php 8 به شکل زیر تغییر یافته است:
1 2 3 4 5 |
ReflectionClass::newInstance(...$args); ReflectionFunction::invoke(...$args); ReflectionMethod::invoke($object, ...$args); |
28- رشته های سالم برای مقایسه عدد ها
RFC در PHP یک حالت بسیار عجیب دارد که در آن این رابطه بر قرار شده و نتیجه true می دهد:
0 == “foo”
اتفاقات عجیب دیگری مانند این مثال نیز در php وجود داشتند که RFC آنها را در php 8 برطرف کرده است.
29- رشته های عددی سالم
سیستم php در نسخه های مختلف خود همیشه در مقابل رشته های عددی، سعی در انجام هوشمندانه ترین اقدامات لازم دارد. RFC در php 8 این اقدامات را پایدارتر و شفاف تر ساخته است.
30- حاشیه نویسی برای عملکرد های داخلی
متدها و عملکردهای داخلی، در بازتاب خود یک نسخه کامل از هر نوع اطلاعاتی را دارا هستند.
31- ext-json همیشه در دسترس است
در نسخه های قبلی نمی توانستیم php را بدون ext-json اجرا کنیم از این رو هر کاربر باید برای اجرای php ابتدا از وجود ext-json مطمئن می شد. در نسخه php 8 دیگر نیازی به این اطمینان خاطر و صرف وقت برای آن نیست. چرا که همیشه در دسترس و برقرار است.
32- تغییرات breaking
یک فهرست از تمام تغییرات breaking که در نسخه php 8 اعمال شده است را سایت های تخصصی php بروز دنیا دریافت کرده و مورد مطالعه قرار دهید، چرا که تعداد بسیار زیادی از آنها بهینه سازی شده اند و php 8 بیش از هر موضوعی، به این تغییرات معروف است.
33- Consistent type errors
در php 8 رفتار عملکردهای داخلی استوار شده است.
34- اپراتور @ دیگر جلوی خطاهای fetal را نمی گیرد
برای استفاده از php 8 مطمئن شوید که display_errors=Off را بر روی سرور تولید کننده خود قرار داده اید.
35- سطح گزارش دهی خطاهای پیش فرض
به جای عبارت هر چیزی از E_ALL اما E_NOTICE و E_DEPRECATED استفاده می کنیم.
این به معنای آن است که بسیاری از خطاهایی که قبلا به صورت بی صدا نادیده گرفته می شدند، اکنون به صورت pop up نمایش داده می شوند.
36- مُد خطای PDO پیش فرض
در حال حاضر این خطا بی صدا است. در php 8 این اخطار به شکل زیر تغییر داده است.
1 |
PDO::ERRMODE_EXCEPTION |
37- اسامی namespace تک رمز شده اند
PHP برای تفسیر هر یک namespace (با یک بک اسلش / جدا شده) به عنوان دنباله ای از نشانه ها استفاده می کرد. RFC در php 8 این رفتار را تغییر داد، به این معنی که اکنون می توان از نام های رزرو شده در namespaceها استفاده کرد.
38- Concatenation precedence
کد زیر:
1 |
echo ("sum: " . $a) + $b; |
در نسخه php 8 به این شکل درآمده است:
1 |
echo "sum: " . ($a + $b); |
39- بررسی های دقیق تر Type برای اپراتورهای arithmetic و bitwise
در نسخه های قبلی php این امکان وجود داشت که این دو اپراتور را بر روی آرایه ها ثبت کنیم. در نسخه php 8 دیگر این کار مقدور نیست و در نتیجه آن این اخطار مشاهده می شود:
1 2 3 4 5 |
TypeError: [] % [42]; $object + 4; |
40- تغییرات مرتبط با پروژه php 7*
علاوه بر تمامی ویژگی ها و امکاناتی که به آن اشاره شد، تغییرات و امکاناتی که در php 7* آغاز شد و در نسخه های مختلف آن تکمیل می شد، در php 8 تکمیل شد.
برخی از این موارد به شرح زیر هستند:
- استهلاک php 7.2
- استهلاک php 7.3
- استهلاک php 7.4
- Locale-independent float to string cast
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.