تیم توسعه پی‎اچ‎پی به تازگی نسخه جدیدی از زبان برنامه نویسی 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 این میزان به ۲.۲ میلیارد تقلیل یافت – چیزی نزدیک به ۷۲% کاهش!

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

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

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

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

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

$object =& new MyClass();

 

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

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

<%

<%=

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

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

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

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

{
public $member = "PHP٧ Is Way Faster";
}
$obj = new SampleObject();
$vars = array("member");
echo $obj->$vars[٠];

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

echo $obj->$vars[٠];
{$obj->$vars}{[٠]}

 

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

echo $obj->{$vars[٠]};

 

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

<?php
class Person
{
public static $company = "HostIran";
public function getFriends()
{
return [
"erika" => function () {
return "Elephpants and Cats";
},
"sammy" => function () {
return "Sharks and Penguins";
}
];
}

public function getFriendsOf($someone)
{
return $this->getFriends()[$someone];
}

public static function getNewPerson()
{
return new Person();
}
}
//DigitalOcean.com
$person = new Person();
echo "\n" . $person->getFriends()["erika"]() . "\n\n"; // new () operator
echo "\n" . $person->getFriendsOf("sammy")() . "\n\n";

 

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

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

<?php
set_error_handler(function ($code, $message) {
echo "ERROR $code: " . $message . "\n\n";
});
function a(ArrayObject $b){
return $b;
}
a("test");
echo "Hello World";

 

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

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

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

php7-Throwable-interface

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

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

  • عملگر spaceship

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

$a <=> $b

 

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

($a < $b) ? -1 : ($a == $b) ? 0 : -1;

 

  • عملگر null coalesce

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

 

$a = isset($b) ? $b : "default";

 

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

$a = $b ?? "default";

 

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

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

function double(int $value)
{
return ٢ * $value;
}
$a = double("٥");
var_dump($a);

 

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

php7-code-snippet

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



Tuesday, June 22, 2021

« برگشت