آنچه که درباره PHP٧ باید بدانید

PHP7-Featured

تیم توسعه پی‎اچ‎پی به تازگی نسخه جدیدی از زبان برنامه نویسی PHP را عرضه کرده‎ است که تا زمان نگارش این مطلب، این نسخه، تنها بصورت آزمایشی جهت بررسی و گزارش ایراد در اختیار برنامه‎نویسان قرار گرفته است. این نسخه جدید که با نام PHP٧ معرفی شده است، بعد از آخرین نسخه رسمی PHP، یعنی ۵.۶ منتشر شده است. البته در ابتدا خبرها حاکی از تصمیم تیم پی‎اچ‎پی مبنی بر انتشار نسخه ۵.۷ بود تا پلی باشد میان کاربران این زبان برنامه‎نویسی با آخرین تغییرات و رویکردهای نسخه جدید، اما این تصمیم هیچگاه عملی نشد.

کارشناسان واحد طراحی و توسعه‌ هاست ایران، با انجام آزمایش‌ها و بررسی‌های گوناگون بر روی نسخه هفتم PHP، مهم‌ترین تغییرات و ویژگی‌های جدید این زبان برنامه‎نویسی را استخراج کرده‌اند که این مطلب به نتایج آن می‌پردازد. لازم به ذکر است آخرین نسخه آزمایشی PHP٧ از وب سایت Zend قابل دریافت است.

تغییرات عمده PHP٧ را می‌توان به صورت زیر دسته بندی کرد:

  1. سرعت بیشتر و کارایی بالاتر
  2. حذف موارد از رده خارج نسخه‌های پیشین
  3. عملگرهای جدید
  4. مرتب‎سازی و یک دست نمودن متغیرها و تخصیص مقدار به آن
  5. نمایش بهتر خطا و Exception و مدیریت کارآمدتر آن‌ها با استفاده از Engine Exception
  6. ویژگی‌های جدید زبانی
  7. نوع‎گذاری قوی (strong type scalars)؛ قابلیت مشخص نمودن نوع پارامترهای یک تابع و مقدار برگشتی از آن

سرعت بیشتر و کارایی بالاتر

سرعت و کارایی یکی از مهم‌ترین دلایلی است که می‌توان برای ارتقا سرورها به PHP٧ بیان کرد، بر اساس نمودارهای ارایه شده، به طور متوسط، سرعت اجرای یک فایل در PHP٧ دست کم دوبرابر php۵.۶ است.

PHP٧ می‌تواند تعداد دوبرابر بیشتر درخواست (request) در ثانیه اجرا کند؛ یعنی بهبودی ۱۰۰ درصدی در بسیاری از موارد. برای مثال، زمانی که PHPNG  (نام هسته جدید PHP در نسخه ۷ است که تیم Zend نام آن را به اختصار PHPNG گذاشته‎اند.) منتشر شد، صفحه خانه سایت وردپرس نیازمند اجرای ۹.۴ میلیارد دستورالعمل از سوی پردازنده بود، در حالی که با PHPNG این میزان به ۲.۲ میلیارد تقلیل یافت – چیزی نزدیک به ۷۲% کاهش!

php7 wordpres

واحد طراحی و توسعه‌هاست ایران با انجام آزمایش‌هایی به بررسی دقیق تر سرعت در PHP٧ پرداخته است. در نمودارهای زیر که نتایج حاصل از این آزمایش‌ها را نشان می‌دهد، یک قطعه کد بصورت همزمان در PHP٧ و PHP۵.۶.۴ اجرا شده است و میانگین زمان اجرای این کد گویای عملکرد ارتقا یافته PHP٧ نسبت به نسخه قبلی PHP، یعنی ۵.۶ است.

آزمایش Instantiation

دریافت ۱۰۰ هزار رکورد از MySQL با استفاده از PDO و Object-Mapping هر رکورد در یک foreach ١٠٠ هزار تایی

آزمایش Instantiation در PHP7

آزمایش Iteration

اجرای یک loop برای یک آرایه صدهزارتایی و اعمال عمل ضرب برای هر عضو آرایه

آزمایش Iteration در PHP7

آزمایش Database (MySQL) SELECT Operation

SELECT صد هزار رکورد از دیتابیسی با اطلاعات واقعی، و اجرای یک loop صدهزارتایی برای کل آرایه

آزمایش Database در PHP7

حذف موارد از رده خارج

PHP مواردی را که در نسخه‌های پیشین خود از رده خارج اعلام کرده بود، رسماً در این نسخه حذف کرده است؛ این بدان معنا است که درصورت استفاده از آن‌ها در PHP٧ با خطا روبرو خواهید شد:

حذف ماژول‌های ereg و mysql

علی رغم تمام هشدارهای چندسال اخیر تیم توسعه PHP مبنی بر ضعف‌های جدی ماژول mysql، کماکان برنامه نویسان علاقه زیادی به استفاده از این ماژول دارند اما خبر بد برای این دسته از برنامه نویسان، آن است که بالاخره در این نسخه از پی اچ پی ماژول mysql حذف شده است. همچنین ماژول ereg به دلیل وجود جایگزینی به نام PCRE (مجموعه توابعی که با preg_ آغاز می‌شوند) در نسخه‌های اخیر چندان مورد استفاده قرار نمی‌گرفت، البته به نظر نمی‌رسد حذف این ماژول برنامه نویسان را با مشکل جدی روبرو سازد.

حذف عملگر new برای reference کردن یک شی

php7-Code-Snippet-001-n

حذف گروهی از تگ‌ها به استثنا تگ <?php

در این نسخه از PHP تگ‌های که شبیه به ASP بودند و همچنین تگ <script> حذف شده‌اند. بر این اساس، دیگر نمی‌توان از تگ‌های زیر در برنامه نویسی به زبان PHP استفاده نمود:

<%

<%=

<script language=’php’></script>

فهرست کامل موارد حذف شده در PHP٧ را می‌توانید در این جا ببینید.

مرتب‎سازی استفاده از متغیرها و عبارت‌های متغیر در متغیری

در نسخه‌های قبلی PHP در مواردی شاهد آن بودیم که یک عبارت را برخلاف استاندارد کلی “چپ-به-راست” تفسیر می‌شد، که این مشکل در نسخه ۷ رفع شده است. به مثال زیر توجه کنید:

php7-Code-Snippet-002-n

در حالی که در این کد ابتدا مقدار  [٠]vars$ تفسیر می‌شود و سپس مقدار آن به عنوان یک عضو از شی SampleClass مورد ارزیابی قرار می‌گیرد. به این دلیل که شی SampleClass یک عضو با نام member دارد، اجرای نهایی خروجی “PHP Is Way Faster” را صادر می‌کند. خوشبختانه این مشکل در PHP٧ حل شده است و تفسیر متغیرها و عبارت متغیر-متغیری منطقی‎تر و بر اساس استاندارد کلی چپ-به-راست صورت می‌گیرد، یعنی در عبارت:

php7-Code-Snippet-003-n

ابتدا $obj->$vars و سپس اولین جز با شاخص ۰ از خروجی این عبارت مورد ارزیابی قرار می‌گیرد. برای حل این مساله، توصیه می‌شود کد خود را با “}” و “{“به روز کنید، یعنی:

php7-Code-Snippet-004-n

البته این تمام ماجرا نیست، تغییرات دیگری هم در ساختار زبانی و دستوری شکل گرفته است، برای مثال کد زیر در PHP٧ کار می‌کند، ولی در نسخه‌های قبلی با خطا روبرو می‌شد:

php7-Code-Snippet-005

مدل جدیدی برای Exception

EngineException کار دریافت خطاها و مدیریت آن‌ها را راحت کرده است. از این پس می‌توان با دریافت خطاهای fatal و recoverable fatal اقداماتی نظیر نمایش، ثبت و بازیابی را در مورد آن‌ها انجام داد. البته EngineException به گونه ای پیاده سازی شده است تا با کدهای قدیمی‎تر هم سازگار باشد، اما در مواردی این سازگاری وجود ندارد. کد زیر را در نظر بگیرید:

php7-Code-Snippet-006

در صورتی که کد بالا در نسخه‌های قبلی PHP اجرا شود، با نمایش ERROR، پردازش قطع شده و تابعی که به set_error_handler() داده شده بود، فراخوانده می‌شد؛ اما در PHP٧ این کد ERROR نشان داده نمی‌شود و به جای آن TypeError از نوع exception و نه ERROR نمایش داده خواهد شد در نتیجه تابعی که در set_error_handler() داده شده است، فراخوانده نمی‌شود و به جای آن PHP٧ خطای زیر را نشان می‌دهد:

php7-Code-Snippet-007-n

برای حل این مساله می‌بایست از بلاک‌های try & catch استفاده نمود.

PHP در نسخه هفتم خود، تغییراتی در Exception ها ایجاد کرده است که به شرح زیر است:

php7-Throwable-interface

ویژگی‌های جدید زبانی

عملگرهای جدید

  • عملگر spaceship

PHP٧ با دو عملگر کاملاً جدید به نام‌های spaceship و null coalesce همراه شده استو عملگر spaceship یا سفینه فضایی (<=>) که نام دیگر آن عملگر مقایسه تلفیقی است، به شما اجازه می‌دهد تا مقایسه‌های زنجیره ای یک دست‎تری داشته باشید. عبارت مقابل را در نظر بگیرید:

php7-Code-Snippet-008

از سمت چپ به راست به خاطر بسپارید: اگر $a کوچک‌تر از $b باشد، ۱- را بر می‌گرداند، اگر مساوی باشند، ۰ و اگر هم $b کوچک‌تر باشد، ۱ را بر می‌گرداند. در واقع عبارت بالا، کوتاه شده این عبارت است:

php7-Code-Snippet-009

  • عملگر null coalesce

این عملگر همانند کاری که isset() انجام می‌دهد، به بررسی مقادیر برای یک متغیر خاص می‌پردازد. پس:

php7-Code-Snippet-0010

با استفاده از این عملگر می‌شود:

php7-Code-Snippet-0011

نوع‎گذاری قوی Strong Type برای مقادیر عددی/رشته‌های متنی

بالاخره در نسخه ۷ پی‎اچ‎پی، strong-type برای پارامترها و مقادیر برگشتی از توابع گنجانده شد. کد زیر تابعی را نشان می‌دهد که نوع پارامترها و مقدار برگشتی از تابع در آن تعیین شده است:

php7-Code-Snippet-0012

هرچند که به صورت پیش فرض اجباری برای این کار نیست ولی اگر برای مثال به جای یک پارامتری که عدد صحیح است، عدد اعشار داده شود، PHP٧ آن را تبدیل می‌کند و خطایی نشان نمی‌دهد. می‌توان با روشن کردن حالت strict، استفاده از strong-type را اجباری کرد و در این حالت در صورت عدم تطابق نوع مقادیر، خطای زیر نشان داده شود:

php7-Code-Snippet-0013-n

به نظر می‌رسد به‎جز مواردی که دربالا به آن‌ها اشاره گردید، ویژگی جدید دیگری به نسخه نهایی PHP٧ اضافه نخواهد شد؛ البته این احتمال وجود دارد که بخش‌های اندکی با تغییر همراه باشد. همانطور که در ابتدای این مطلب بیان شد، آخرین نسخه PHP هنوز بصورت آزمایشی ارائه شده است؛ به همین دلیل تا زمانی که نسخه نهایی آن منتشر نشده، توصیه می‌کنیم از PHP٧ در پروژه‌های خود استفاده نکنید؛ اگر می‌خواهید با ساختار و آخرین تغییرات این زبان آشنا شوید، می‌توانید از نسخه‌های متعددی که برای برنامه نویسان عرضه شده است، استفاده نمایید.

/پایان مقاله