30 مهر 1398 ساعت 09:17

آنچه در php نسخه ۷٫۴ خواهد آمد

در این مقاله قصد داریم برخی از مهمترین امکاناتی که در php7.4 افزوده شده است را به شما معرفی کنیم. برای نمونه در این نسخه از php قابلیت استفاده از Arrow Functions ها افزوده شده که خود می تواند به کوتاه نویسی و زیبایی در کد نوشته شد کمک زیادی کند.

همانطور که می دانید کمتر از یک ماه است که نسخه جدید php یعنی php 7.4 بصورت آزمایشی منتشر شده است. نسخه رسمی php 7.4 در تاریخ ۲۸ نوامبر ۲۰۱۹ منتشر خواهد شد بنابراین توصیه می شود تا زمان انتشار رسمی php7.4 از نصب نسخه بتا بر روی سرور های خود و راه اندازی پروژه های خود بر روی این نسخه خودداری نمایید.

البته جالب است بدانید این نسخه بصورت freeze شده می باشد و نسخه بعدی php یعنی php 8 هم اکنون توسط توسعه دهندگان php در حال ایجاد می باشد که می توان این نسخه(8.0) را یک نقطه عطف برای این زبان شیرین و جذاب در نظر گرفت. 

 تاریخ های انتشار نسخه 7.4 بصورت زیر می باشد:

June 6th: PHP 7.4 Alpha 1

July 18th: PHP 7.4 Beta 1 – Feature freeze

November 28th: PHP 7.4 GA Release

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

امکانات جدید در php نسخه 7.4:

Support for Typed Properties
Support for Arrow Functions
Covariant Returns and Contravariant Parameters
Support for coalesce assign (??=) operator
Support for WeakReferences
Preloading
Spread Operator in Array Expression
Deprecations

 

پشتیبانی از تعیین نوع برای متغیر ها
همانطور که می دانیم در php امکان تعیین نوع متغییر ها از دیر باز وجود نداشت، در نسخه ۵ قابلیت Type hints به این زبان افزوده شد و در این نسخه (7.4) این امکان افزوده شده که شما بتوانید نوع متغییر های خود را نیز تعریف کنید

شما میتوانید انواع مختلف bool, int, float, string, array, object, iterable, self, parent یا نوع کلاس، اینترفیس یا nullable types (?type) را استفاده نمایید

برای آشنایی بیشتر به کدهای زیر دقت کنید:


class User {

    public int $id;

    public string $name;

    public function __construct(int $id, string $name) {

        $this->id = $id;

        $this->name = $name;

    }

}

تعریف نوع متغییر با استفاده از یک کلاس


public int $scalarType;
protected ClassName $classType;
private ?ClassName $nullableClassType;
public float $x, $y;

شما می توانید بصورت پیش فرض مقادیر متغییر های خود را تنظیم کنید، البته باید این مقدار با نوع تعریف شده ی متغییر هماهنگی داشته باشد. اما مقادیر nullable می توانند مقداری برابر null  نیز داشته  باشند:

public string $str = "foo";
public ?string $nullableStr = null;

 تعریف متغیر های استاتیک:

public static iterable $staticProp;

اگر داده ای بر خلاف نوع تعریف شده برای متغییر به متغییر داده شود پیغام خطایی ارسال خواهد شد، به کد زیر دقت کنید:

class User {
  public int $id;
  public string $name;
}

$user = new User;
$user->id = 10;
$user->name = [];

در اینجا متغییر name بصورت string تعریف شده است اما ما مقداری برابر array برای آن تعریف کرده ایم، با اجرای کد بالا php خطای زیر را برخواهد گرداند:

Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9

 

پشتیبانی از Arrow Functions


همانطور که می دانیم Arrow Functions  ها یک راه میانبر برای نوشتن anonymous functions (توابع بی نام) می باشند. توابع بی نام پیشتر در javascript, java, سی شارپ و.. وجود دارند.

از Arrow Functions‌ ها برای پاس دادن یک تابع بی نام به تابعی دیگر استفاده می شود که باعث ایجاد کد کمتر و خوانا تر نیز می شوند.

هم اکنون در نسخه 7.4 پی اچ پی این قابلیت افزوده شده و شما می توانید از Arrow Functions ها استفاده کنید. بیایید با همدیگر چند نمونه از استفاده Arrow Functions ها را بررسی کنیم:

کد زیر را در نظر بگیرید:

function cube($n){
  return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);

در php نسخه 7.4 شما می توانید کد بالا را بصورت خلاصه ی زیر بنویسید:

$a = [1, 2, 3, 4, 5];
$b = array_map(fn($n) => $n * $n * $n, $a);
print_r($b);

arrow functions ها می تواند  با استفاده از use  متغییر های بیرونی را نیز دریافت کنند:

$factor = 10;
$calc = function($num) use($factor){
  return $num * $factor;
};

اما در php نسخه 7.4 این کار بصورت ضمنی انجام و مقادیر دریافت می شوند پس ما می توانیم کدهای بالا را بصورت زیر خلاصه کنیم:

$factor = 10;
$calc = fn($num) => $num * $factor;

 

پشتیبانی از Covariant Returns و Contravariant Parameters

همانطور که می دانیم در پی اچ پی محدودیت های برای پارامترهای برگشتی و نوع برگشتی وجود دارد و مقدار برگشتی باید با نوع برگشتی یکسان باشد. اما در نسخه 7.4 دو قابلیت جدید بنام Contravariant و Covariant به php افزوده شده است که این محدودیت را برداشته است. بهتر است قبل از توضیحات بیشتر کمی در مورد Covarian  صحبت کنیم.

Covariant چیست؟

نوع خروجی covariant بدین معنی است که اگر توسعه دهنده بدنه ی متدی از کلاس پدر را در کلاس فرزند بازنویسی کرد، می تواند نوع بازگشتی یا خروجی متد را در کلاس فرزند، بر روی زیرنوعی (subtype) از نوع بازگشتی متد اصلی (بازنویسی شده) تنظیم کند. به عبارت دقیق تر، نوع بازگشتی covariant به شرایطی اشاره دارد که در آن نوع خروجی متد بازنویسی کننده (متدی در که کلاس فرزند override می شود) به نوع مربوط به return type متد بازنویسی شده (متد کلاس پدر) مرتبط می باشد. (تحلیل داده)

به کد زیر دقت کنید:

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }
}

کد بالا یک نمونه از قابلیت covariant می باشد. همانطور که مشاهده می کنید در کلاس B ما متد covariantReturnTypes را باز نویسی یا override کردیم اما مقدار برگشتی آن برابر با مقدار از پیش تعریف شده یعنی ParentType نمی باشد و برابر مقدار ChildType می باشد. که کلاس ChildType  خود کلاس ParentType را به ارث برده است که در نسخه 7.4 شما می توانید به این صورت از covariant در php استفاده نمایید.

یک نمونه از contravariant: 

class A
{
    public function contraVariantArguments(ChildType $type)
    { /* … */ }
}

class B extends A
{
    public function contraVariantArguments(ParentType $type)
    { /* … */ }
}

یک نمونه دیگر از استفاده Covariant در نسخه جدید php


class A {}
        class B extends A {}
        class Producer {
            public function method(): A {}
        }
        class ChildProducer extends Producer {
            public function method(): B {}

 

قابلیت Null coalescing assignment operator:

قابلیت Null coalescing operator از نسخه 7.0 پی اچ پی افزوده شد. این قابلیت نحوه نگارش زیباتری برای بررسی وجود و عدم وجود یک متغیر یا یک مقدار را ارایه می دهد. به کد زیر دقت کنید، در این کد قسمت اول معادل قسمت دوم می باشد و همانطور که می بینید نحوه نگارش بسیار زیبا تر و بهتر شده.

$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

حال در نسخه 7.4 باز هم این نحوه نگارش زیباتر شده و کاهش بیشتری در کدها مشاهده خواهیم کرد. برای نمونه کد بالا بصورت زیر تبدیل خواهد شد:

$username = $_GET['user'] ?? ‘nobody';

کد بالا بررسی خواهد کرد اگر مقدار $_GET['user'] وجود نداشت مقدار nobody را برای آن در نظر خواهد گرفت. به بیان دیگر اگر مقدار سمت چپ تهی باشد، مقدار سمت راست برگشت داده خواهد شد.

 

قابلیت Array spread operator

در نسخه 5.6 پی اچ پی قابلیت argument unpacking به توابع افزوده شد، این قابلیت به شما این امکان را می دهد که لیستی از آرگومان ها را در هنگام فراخوانی یک تابع به تابع مورد نظر پاس دهید. کد زیر یک نمونه از استفاده argument unpacking را در php نمایش می دهد:

function adder(...$numbers)
{
    $sum = 0;

    foreach ($numbers as $number)
    {
        $sum += $number;
    }

    return $sum;
}

// Both of these work.
adder(1,2);
adder(1,2,3,4,5,6,7);

 

در نسخه 7.4 نیز این قابلیت به array ها افروده شد و شما می توانید از امکان Array spread operator به راحتی استفاده کرده و دیگر نیازی به استفاده از تابع array_merge برای متصل کردن دو آرایه نخواهید داشت

کد زیر در php 7.3 نوشته و اجرا شده است:

$arrayA = [1, 2, 3];

$arrayB = [4, 5];

$result = [0, $arrayA, $arrayB, 6 ,7];
//result:
//Array ( [0] => 0 [1] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [2] => Array ( [0] => 4 [1] => 5 ) [3] => 6 [4] => 7 )

 

همین کد در نسخه 7.4 و با استفاده از قابلیت Array spread operator بصورت زیر نوشته خواهد شد و خروجی آن یک آرایه خواهد بود:

$arrayA = [1, 2, 3];

$arrayB = [4, 5];

$result = [0, ...$arrayA, ...$arrayB, 6 ,7];

// [0, 1, 2, 3, 4, 5, 6, 7]

البته به این نکته توجه کنید که این قابلیت تنها برای آرایه هایی مناسب خواهد بود که کلید عددی دارند.

 

 Numeric Literal Separator

این قابلیت به شما این امکان را خواهد داد که از underscores (ـ) برای جدا سازی مقادیر عددی بصورت زیر استفاده کنید:

$unformattedNumber = 107925284.88;

$formattedNumber = 107_925_284.88;

 موتور پی اچ ـ را نادیده خواهد گرفت.

 

Custom object serialization 

دو متد جادویی __serialize و __unserialize به نسخه 7.4 افزوده شده است

 

حذف تگ کوتاه شروع:

تگ ?> در این نسخه از php منسوخ شده است و در نسخه 8.0 بصورت کلی حذف خواهد شد.

 

تغییر در تقدم اپراتور پیوست رشته (.)

در حال حاضر در php دو عملگرد + و - عملگردهای حسابی و عملگرد . (نقطه) عملگرد اتصال دو رشته می باشد و این عملگردها از لحاظ تقدم در یک سطح قرار دارند. (اینجا را ببینید)

کد زیر را در نظر بگیرید:

echo "sum: " . $a + $b;

در php 7.3 با اجرای خط بالا با خطایی همانند خطای زیر مواجه خواهید شد:

Warning: A non-numeric value encountered in /home/iman/Desktop/php/index.php on line 18

خطای بالا به این دلیل رخ می دهد که عملیات جمع به دلیل برابر بودن تقدم عملگردهای . و + از سمت چپ شروع میشود(همانند کد زیر) و همانطور که می دانیم جمع یک رشته با عدد امکان پذیر نمی باشد و php پیغام خطایی صادر خواهد کرد. 

echo ("sum: " . $a) + $b;

در این نسخه از php پیشنهاد شده است که اولویت (.) به + و - کاهش پیدا کند و عملگرد (.) از تقدم کمتری نسبت به عملگردهای + و - برخوردار شود (اینجا را ببینید) . پس کد بالا معادل خط زیر خواهد شد:

echo "sum: " . ($a + $b);

دو پروپزال برای این تغییر اعلام شده است:

- این تغییر از نسخه 7.4 پی اچ پی اغاز خواهد شد و PHP هنگام مواجه شدن با عباراتی که شامل . + و- می باشند یک اخطاریه صادر خواهد کرد

- تغییر واقعی و نهایی در اولویت این ۳ اپراتور از نسخه ۸ اعمال خواهد شد.

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

 

افزودن تابع mb_str_split:

این تابع همان عملکرد تابع str_split را دارد اما بر روی رشته های چند بایتی نیز عمل خواهد کرد.

 

تغییرات بالا بخشی از مهمترین تغیرات در نسخه 7.4 پی اچ پی می باشند. این نسخه در تاریخ 28 نوامبر 2019 منتشر خواهد شد. در صورتی که سوال یا پیشنهادی دارید از بخش نظرات برای ما ارسال کنید

65 admin
نظرات

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

پاسخ به نظر
اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!

هنوز برای این مطلب نظری ارسال نشده است!
0