زبان PHP یکی از پرطرفدارترین زبانهای دنیاست و مثل هر زبان برنامهنویسی دیگری، سازندگان و مشارکتکنندگان در آن، سعی در ارتقاء و بهبود آن دارند.
جالب اینجاست که در اکثر نرمافزارها، نسخهی جدید معمولا باعث میشود کمیسنگینتر شود و میزان RAM موردنیاز برای اجرای آن بیشتر شود اما PHP نسخه 7 کاملا برعکس است!
در اواخر سال ۲۰۱۵ شاهد انتشار نسخه 7 از زبان PHP بودیم. و در حال حاظر نسخه 7.1 PHP منتشر شده و نسخه PHP 7.2 به صورت beta منتشر شده است.
در سال ۲۰۰۵، تلاشهایی برای توسعه نسخه جدید آغاز شد. این نسخه تحت نام PHP6 کار توسعه خود را آغاز کرد. در حین کار بدلیل مشکلاتی که در اجرای یونیکد در PHP بوجود آمد در سال ۲۰۱۰ توسعه آن متوقف شد. اما اینکه چرا نام ورژن جدید، PHP7 شد به این دلیل است که منابع و کتابهای زیادی برای آن ورژن متوقفشده یعنی PHP6 منتشر شد. این نگرانی وجود داشت که اگر ورژن جدید را همان PHP6 بگذارند ممکن است تداخلی در داکیومنتها و کتابهای ریفرنسِ ورژن کار شده در سال ۲۰۰۵ ایجاد بشود. به همین دلیل یک RFC برای انتخاب نام جدید PHP در ورژن جدید آینده ایجاد شد. که در نهایت PHP7 انتخاب شد.
در تستهای متعددی که شده و نتایجش در وب به وفور یافت میشود، مشخص است که از نظر میزان مصرف رم و سرعت اجرا، PHP7 نه تنها از نسخههای قبلی خود به صورت چشمگیری سریعتر است بلکه از سایر مفسرهای php مانند HHVM که توسط فیسبوک در سال 2010 معرفی شد نیز در مجموع سریعتر است.
مهمترین تفاوت و مزیت PHP7 همان است که در بالا اشاره شد. این مزیت بزرگ قطعا شما را واردار میکند که به سمت PHP7 بیایید. علاوه بر آن، برخی موارد قدیمی و منسوخ شده (مانند توابع آغاز شونده با _mysql یا ereg و همچنین توابع مرتبط با magic quote و ...) در PHP7 حذف شدهاند و چند مورد جدید نیز به آن اضافه شده است.
در این مطلب به چند نمونه از موارد جدید PHP7 و PHP7.1 اشاره میشود:
در PHP7 امکان تعریف آرایه به صورت define فراهم شده است و البته در PHP نسخه 5.6 به بعد امکان تعریف آرایه به صورت ثابت هم فراهم شده بود:
اپراتور جدید و پرکاربرد <=>(spaceship) در PHP7 به این صورت عمل میکند که اگر متغیر سمت چپ بزرگتر از متغیر سمت راست آن باشد، 1 و در صورت تساوی 0 و در غیر اینصورت منفییک برمیگرداند. این اپراتور در توابعی همچون array_filter و usort و ... در کم شدن حجم شما موثر خواهد بود.
همچنین اپراتور جدید ?? نیز به شما کمک میکند که از زحمت چککردن وجود یک متغیر خلاص شوید!
$name = $_GET['name'] ?? 'khali';
// خط بالا معادل کد زیر در نسخه ماقبل هفت پیاچپی است
if(isset($_GET['name']))
$name = $_GET['name'];
else
$name = 'khali';
// که قابلیت چندبار استفاده در یک عبارت محاسباتی را نیز داراست
$var = $a ?? $b ?? $c ?? $default;
در زبان پیاچپی علاوه بر آرایه، میتوانستیم یک شئ از یک کلاس مشخص را سریالایز کنیم و به صورت یک رشته (String) درآوریم. با این کار نام کلاس و پراپرتیهای مختص آن شئ به صورت یک رشته ذخیره میشد. اما یک مشکل امنیتی این بود که در زمان unserialize کردن، ممکن بود رشته مربوطه که از دیتابیس بازخوانی شده، دستکاری غیرمجاز شده باشد و در زمان آنسریالاز، به شئای از یک کلاس دیگر تبدیل شود و فاجعهای به بار آورد.
در PHP 7 این امکان اضافه شده که در زمان آنسریالایز، معین کنید که خروجی الزاما باید شئای از فلان کلاس باشد.
به دلیل شیوع استفاده از کاراکترهای اموجی و اسمایلی (رنج بالای یونیکد)، کار با آنها در PHP 7 راحتتر شده است. برای دسترسی به کاراکترهای یونیکد در PHP7 به سادگی میتوانید کدی شبیه \u{260E}بنویسید.
یکی از تغییرات خوب PHP7 این است که میتوان ورودی و خروجی موردانتظار یک فانکشن را مشخص کرد. شبیه بسیاری از زبانهای برنامهنویسی دیگر. البته این امر اختیاری است لذا کدهای قدیمی شما هیچ مشکلی از این لحاظ با PHP7 نخواهند داشت.
در زمان تعریف یک تابع، ابتدا کلید واژه function و سپس نام تابع، سپس ورودیهای آن در بین دو پرانتز ذکر میشد. حال قبل از تعریف ورودی میتوانید نوع آن را ذکر کنید. همچنین قبل از تعریف کد مربوط به فانککشن در آکولاد، میتوانید از علامت کالن (:) و سپس ذکر نوع خروجی استفاده کنید:
function mul(int $a, int $b){return $a*$b;} // تعریف نوع ورودی تابع
function sum($a, $b):int{return $a+$b;} // تعریف نوع خروجی تابع
در صورتی که میخواهید برنامه نسبت به موارد فوق حساس باشد، میتوانید عبارت declare(strict_types=1); را در ابتدای کد خود قرار دهید.
نوعهای مجاز عبارتند از: int, string, bool, float, array
عملگر جدید ?? (null coalesce) در PHP 7 ما رو در چک کردن مقدار متغییر راحت کرده.این عملگر رو با مثال توضیح میدم.به کد زیر دقت کنید.
// روش قدیمی
$a = isset($b) ? $b : '0';
// روش جدید
$a = $b ?? '0'
هر دو خط کد بالا یک کار انجام میدهند.ولی دومی بهینه تر هست.
هر دو خط کد مقدار متغییر b را چک میکنند در صورتی مقدار متغییر b خالی باشد مقدار متغییر a عدد 0 خواهد شد.در غیر اینصورت برابر مقدار متغییر b خواهد شد.
اعلان گروهی use در PHP 7
use megaweb\web\Controller;
use megaweb\web\NotFoundHttpException;
use megaweb\web\{
Controller,
NotFoundHttpException,
};
امکان کچ کردن آنچه که باعث خطای مهلک میشود در PHP 7
امکان وصل کردن توابع بدون اسم به یک آبجکت در runtime درPHP 7
class Foo{ public $bar;}
$foo = new Foo();
$foo->bar = 2;
$foobar = function($param) {echo $this->bar + $param;};
$foobar->call($foo, 4); /* 6 */
امکان تعریف مقدار بازگشتی برای توابع همانند زبان C در PHP 7
function megaweb(): int{
return [];
}
megaweb(); /* Fatal Error: Return value of hive() must be of the type integer, array returned
نکته: PHP اگر امکانش باشد داده خروجی را به نوعی که شما برای تابع تعریف کردهاید تبدیل میکند، البته اگر بشود.
امکان تعریف نوع دادههای ورودی در توابع درPHP 7
function megaweb(int $number, string $text, boolean $display)
امکان تعریف کلاسِ بدون اسم همانند توابع بدون اسم در PHP 7
new class() {}
کامپایلر PHP7 کاملا بازنویسی شده و در قسمت مدیریت مموری هم بیشتر سعی شده با stack کار بشود تا heap، که طبیعتا سرعت پردازش سریعتر خواهد شد.
پی اچ پی ۷٫۱ بصورت نهایی ارائه شد و حالا توسعه دهنده ها میتونن از اون در پروژه های خودشون استفاده کنن . در این نسخه جدید ، ویژگی های تازه ای به PHP اضافه شده مثل Nullable types ، Void return type ، Class constant Visibility و … . که در این پست قصد دارم یه نگاه سریع به سه تا از مهمترین ویژگی های اضافه شده به php 7.1 داشته باشم .
Nullable types
function answer(): ?int {
return null; //ok
}
function answer(): ?int {
return 42; // ok
}
function answer(): ?int {
return new stdclass(); // error
}
این ویژگی به این صورت عمل میکنه که شما در کنار و قبل نوع داده چه برگشتی چه ورودی اگر از علامت سوال استفاده کنید مقدار اون میتونه null باشه . مثال بالا دقیق نشون دهنده همین موضوع است .
Void Return Type
همینطور که از عنوان هم مشخصه شما میتونید بسادگی توابع Void تعریف کنید ، یعنی توابعی که چیزی رو بر نمیگردونن و فقط یک کاری رو داخل خودشون انجام میدن ، به مثال زیر دقت کنید هر چهار تابع از نوع Void هستن اما در مثال اول و آخر سعی شده مقداری برگشت داده بشه حتی اون مقدار null باشه که این تلاش با ارور مواجه شده . در مثال دوم شما عملا از return استفاده نمیکنید و این خودش نشون دهنده void بودن تابع اس و در مثال سوم درسته که از return استفاده میشه اما هیچ مقداری حتی null هم برگشت داده نمیشه که این موضوع اروری هم ایجاد نمیکنه .
function should_return_nothing(): void {
return 1; // Fatal error: A void function must not return a value
}
function lacks_return(): void {
// valid
}
function returns_nothing(): void {
return; // valid
}
function returns_null(): void {
return null; // Fatal error: A void function must not return a value
}
Class constant Visibility
خوب شما از این نسخه به بعد میتونید برای ثابت های که درکلاس تعریف میکنید سطح دسترسی مشخص کنید . به مثال زیر دقت کنید کاملا میتونید مفهوم این موضوع رو متوجه بشید .
class Token {
// Constants default to public
const PUBLIC_CONST = 0;
// Constants then also can have a defined visibility
private const PRIVATE_CONST = 0;
protected const PROTECTED_CONST = 0;
public const PUBLIC_CONST_TWO = 0;
//Constants can only have one visibility declaration list
private const FOO = 1, BAR = 2;
}
پس از انتشار نسخه نهای php 7.2 امکانات جدید آن به این مقاله افزوده می شود.