امکانات جدید نسخه های php هر کدام نسبت به ورژن قبلی

امکانات جدید نسخه های php هر کدام نسبت به ورژن قبلی

امکانات جدید نسخه های php هر کدام نسبت به ورژن قبلی

 

ویژگی های  php 8

 php 8 آخرین نسخه از زبان برنامه نویسی php است که در 26 نوامبر 2020 ارائه شد. برخی امکانات در این نسخه برای رفع ایرادات مهم نسخه های قبلی ارائه شده است. همچنین یک سری ویژگی های php 8  ، جدید هستند و امکانات جذابی را به این برنامه اضافه کرده اند. در ادامه به بررسی برخی از مهم ترین ویژگی های 8 php می پردازیم برای اینکه بهتر متوجه شوید که امکانات جدید php 8 چیست تا انتهای این مقاله با ما همراه باشید.

 

Union type ها

Union Type ها اجازه معرفی بیش از یک تایپ (return types ،parameters و class properties) را می‌دهند.

 

public function foo(Foo|Bar $input): int|float;

توجه داشته باشید که void هرگز نمی‌تواند بخشی از یک union type باشد، زیرا "no return value at all" ( هیچ مقدار برگشتی وجود ندارد)‌ را نشان می‌دهد. به علاوه، nullable union ها می‌توانند با استفاده از |null ، یا با ? نوشته شوند.

public function foo(Foo|null $foo): void;
 
public function bar(?Bar $bar): void;
 

کامپایلر jit

JIT یا همان Just In Time، امکانی است که قرار بود آن را به php 7.4 اضافه نمایند اما بعدا بنا بر دلایلی نظرشان عوض شد و تصمیم به قرار دادن این ویژگی در نسخه php 8 گرفتند. همانطور که از اسمش مشخص است، وظیفه اصلی آن کامپایل کردن یا در واقع جمع آوری کردن تمام کدهای پروژه ما حین اجراست.

اما ممکن است برایتان سوال پیش بیاید که مگر کدهای php نیازی به کامپایل شدن دارند؟ پاسخ هم بله است هم خیر! چرا که php به صورت مستقیم نیاز به کامپایل کردن کدها ندارد، بلکه تحت فرمان OP cash یکبار کدها را خوانده و جمع آوری می کند و از آن به بعد فقط آنها را صدا می زند.

کاری که JIT انجام می دهد این است که هر زمان شما نیاز به اجرای کدهایتان پیدا کردید آن را به صورت Just In Time یعنی درست در همان زمان کامپایل کرده و به اجرا در می آورد. نه اینکه مانند گذشته فقط یکبار برای بار اول فراخوانی کدها آنها را جمع آوری کند.

 

آرگومان‌های نامدار (Named arguments)

«آرگومان‌های نامدار» (Named arguments) امکان ارسال مقادیر به یک تابع را با تعیین نام مقدار فراهم ساخته‌اند، به طوری که دیگر نیازی به توجه به ترتیب آرگومان‌ها وجود ندارد و می‌توانید پارامترهای اختیاری را نیز رد کنید.
function foo(string $a, string $b, ?string $c = null, ?string $d = null) 
{ /* … */ }

foo(
    b: 'value b', 
    a: 'value a', 
    d: 'value d',
);
 

اپراتور nullsafe

اگر با اپراتور (null coalescing) کار کرده باشید از قبل با کاستی های آن آشنا هستید. حتماً می‌دانید که این اپراتور نمی‌تواند برای متدهایی که فقط یک آبجکت دارند، عمل کند. در صورت استفاده از این عملگر برای متدهای دارای یک آبجکت، با یک خطا تحت عنوان «this method is not defined!» روبرو خواهید شد.

با اضافه شدن عملگر nullsafe، اکنون می توانیم رفتاری شبیه به ادغام تهی روی متد ها داشته باشیم.

$dateAsString = $booking->getStartDate()?->asDateTimeString();
 

 Attributes

Attributes اجازه می دهد تا متا داده ها(meta-data) را برای توابع، کلاس ها، ویژگی ها و پارامترها اعلام کنید. در نسخه‌های پیشین، برای این کار در حین کد نویسی، از عملگر ‘doc_comments’ استفاده می‌شد.صفت ها یا attribute ها برای یادداشت نویسی یا اضافه کردن داده های متا در کلاس استفاده می شوند.

 
/**
* @param string $message
*/
function foo(string $message) {}
 
#[Attribute]use App\Attributes\ExampleAttribute;

#[ExampleAttribute]
class Foo
{
#[ExampleAttribute]
public const FOO = 'foo';

#[ExampleAttribute]
public $x;

#[ExampleAttribute]
public function foo(#[ExampleAttribute] $bar) { }
}


class ExampleAttribute
{
public $value;

public function __construct($value)
{
$this->value = $value;
}
}
 

بهبود ویژگی تابع constructor در شی گرایی

مشکل تابع constructor در شی گرایی در این نسخه برطرف شده است. حال برای اینکه بفهمید این مشکل چیست به مثال زیر دقت کنید:

class Money
{
public Currency $currency;

public int $amount;

public function __construct(
Currency $currency,
int $amount,
) {
$this->currency = $currency;
$this->amount = $amount;
}
}
در این کد دو ویژگی با نام های currency و amount تعریف شده که با تابع constructor مقداردهی می شود. این دو ویژگی به عنوان آرگومان های ورودی تابع قرار داده شده اند و در داخل تابع مقدار دهی می شوند. حال آنکه می توان این کد را بصورت زیر خلاصه سازی کرد و از تکرار مجدد این آرگومانها پرهیز کرد.
class Money
{
public function __construct(
public Currency $currency,
public int $amount,
) {}
}
 
 

عبارت Match

این عبارت را می‌توان برادر بزرگ‌تر عبارت switch در نظر گرفت. Match می‌تواند مقادیر را بازگشت دهد و نیازی به گزاره‌های break هم ندارد. با بهره‌گیری از این عبارت می‌توانید شرط‌ها را ترکیب کنید، از ترکیب نوع صریح استفاده کنید و هیچ نوع کاهش نوع نداشته باشید. به مثال زیر توجه کنید:

$result = match($input) {
    0 => "hello",
    '1', '2', '3' => "world",
};
 

قابلیت class:: بر روی اشیا

قبلا در کلاس های اشیا از get_class, استفاده می شد. این دستور مشخص نمیکرد که این شی متعلق به کدام کلاس است. دستور class:: این قابلیت را دارد که کلاس را نیز مشخص کند. بطور مثال:
$foo = new Foo();

var_dump($foo::class);
 

نوع داده Mixed

یک نوع داده ای جدید است که می تواند انواع داده ای زیر را در خود جا دهد.

string|int|float|bool|null|array|object|callable|resource

نوع داده Mixed می تواند آرگومان ورودی یک تابع یا نوع داده خروجی تابع باشد. همچنین می توان از آن بعنوان پارامتر یک کلاس استفاده کرد. این نوع داده ای به شما امکان می دهد متغیرهایی تعریف کنید که هر کدام از این انواع داده ای را بتوانند در خود قرار دهند. مثال:

class Example {
public mixed $exampleProperty;
public function foo(mixed $foo): mixed {}
}

نکته : Mixed نوع داده null را نیز در خود دارد بنابراین نیازی نیست که متغیر خود را nullable تعریف کنید در غیر اینصورت با خطا مواجه می شوید.

 

ext-json همیشه در دسترس است

تا پیش از این، امکان کامپایل PHP بدون فعال‌سازی پسوند JSON وجود داشت، اما این موضوع دیگر ممکن نیست. از آنجا که JSON کاربرد بسیار گسترده‌ای دارد، بهتر است که توسعه‌دهندگان بتوانند به صورت پیش‌فرض روی آن تکیه کنند، تا این که مجبور باشند ابتدا آن را فعال کنند.

 

ارث بری با توابع private

قبل از PHP 8 به این صورت بود که همان بررسی‌هایی که بر روی متدهای public و protected انجام می‌شد بر روی private نیز انجام می‌شد، به عبارت دیگر متدهای private باید همان قوانینی را پیروی کنند که متدهای protected و public پیروی می‌کردند و از آن جایی که متدهای private درون کلاس‌های فرزند در درسترس نیستند این مورد با عقل جور در نمی‌آید.

RFC این رفتار را تغییر داده است و دیگر بررسی‌های مرتبط با ارث‌بری برای متدهای private اعمال نمی‌شود، در نتیجه استفاده از final private function نیز معنی ندارد و اگر این مورد استفاده شود با Warning زیر برخورد خواهید کرد.
Warning: Private methods cannot be final as they are never overridden by other classes

 

بهبود متد abstract در traitها

ویژگی‌های جدید php 8 : درون Traitها شما می‌توانید متدهایی (Method) از نوع abstract ایجاد کنید که هر زمان یک کلاس این traitها را use کرد مجبور به پیاده سازی متد abstract درون trait شود. قبل از PHP 8 امضای (منظور از امضا یا signature همان نوع ورودی و خروجی یک تابع است) پیاده سازی متدهای abstract معتبر نبود. قبلا از PHP 8 به صورت زیر معتبر بود.

trait Test {
    abstract public function test(int $input): int;
}
class UsesTrait
{
    use Test;
    public function test($input)
    {
        return $input;
    }
}

در PHP 8 زمانی که شما می‌خوا‌هید یک متد abstract برای trait را پیاده‌سازی کنید، اعتبارسنجی را به شکلی بهتر و به درستی انجام می‌دهد. پس از PHP 8 به بعد شما می‌توانید این گونه این متد را پیاده سازی کنید.

class UsesTrait
{
    use Test;
    public function test(int $input): int
    {
        return $input;
    }
}

 

Throw expression 

این RFC موجب تغییر throw از statement بودن به expression بودن شده، که می‌شود throw exception در بسیاری از مکان‌های جدید امکان‌پذیر باشد:

$triggerError = fn () => throw new MyError();
 
$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
 

توابع و کلاس‌های جدید

تابع تعریف مثال
str_contains بررسی می‌کند که آیا needle درون haystack می‌باشد یا خیر str_contains('Foobar', 'Foo')
str_starts_with بررسی می‌کند که آیا needle با رشته haystack آغاز می‌شود یا خیر str_starts_with('PHP 8.0', 'PHP')
str_ends_with بررسی می‌کند که آیا needle با رشته haystack پایان می‌یابد یا خیر str_ends_with('PHP 8.0', '8.0')

PHP 8.0 همچنین توابعی مانند fdiv ،get_resource_id ،get_debug_type و preg_last_error_msg را ارائه کرده است.

تابع تعریف
fdiv بخش float از استاندارد IEEE-754 در Floating-Point Arithmetic
get_resource_id ID داخلی را برای PHP resource مورد‌نظر برمی‌گرداند.
get_debug_type type داخلی یک متغیر را برمی‌گرداند.
preg_last_error_msg پیغام خطای آخرین عملیات preg را برمی‌گرداند.
نویسنده :
مجید پورداود
  • مجید پورداود
  • مهندس نرم افزار و تحلیلگر ارشد سیستم های کامپیوتری تحت وب می باشم. از سال 1395 برنامه نویسی را شروع کردم و به زبان های php (فریم ورک laravel -codeigniter)  و زبان جاوا اسکریپت (فریم ورک express.js-nest.js)  تسلط دارم.  

ثبت دیدگاه جدید

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *