PHP 8.0: معرفی نسخه جدید PHP چرا به PHP 8.0 نیاز دارید؟

  • Home
  • hosting
  • PHP 8.0: معرفی نسخه جدید PHP چرا به PHP 8.0 نیاز دارید؟
PHP 8.0: معرفی نسخه جدید PHP
آوریل 23, 2022

PHP 8.0: معرفی نسخه جدید PHP

ما بسیار هیجان زده هستیم که اعلام کنیم PHP 8.0 اکنون در سرورهای هاستینگر در دسترس است. این نسخه PHP با ویژگی ها و تغییرات جدید ارائه می شود تا بهترین عملکرد ممکن را برای پروژه های وب شما ارائه دهد.

از آنجایی که این یک به‌روزرسانی بزرگ است، ما همه کاربرانی را که به آخرین نسخه مهاجرت می‌کنند تشویق می‌کنیم تا با تغییرات جدیدی که در این مقاله به آنها خواهیم پرداخت آشنا شوند.

چرا به PHP 8.0 نیاز دارید؟

آخرین تست های بنچمارک توسط فورونیکس نشان می دهد که PHP 8.0 10 درصد بهتر از نسخه های قبلی خود عمل می کند. این داده ها آینده امیدوار کننده ای را برای وب سایت ها و برنامه های کاربردی مبتنی بر PHP نشان می دهد.

 PHP 8.0: معرفی نسخه جدید PHP

بهتر از آن، این آزمایش حتی با استفاده از کامپایلر JIT، یک ویژگی بهینه‌سازی جدید که با PHP 8.0 معرفی شد، انجام نشد. اگر فعال باشد، توسعه‌دهندگان می‌توانند انتظار عملکرد بسیار سریع‌تری داشته باشند.

علاوه بر این، نسخه 8.0 ویژگی‌های جدیدی را برای کدنویسی سریع‌تر و تمیزتر پیاده‌سازی می‌کند و تعداد زیادی از boilerplate و کد اضافی را کاهش می‌دهد.

از آنجایی که این یک نسخه به‌روزرسانی است، وب‌سایت شما احتمالاً تغییراتی را تجربه می‌کند که ممکن است در صورت انتقال به PHP 8.0 بدون انجام هیچ گونه تغییر قبلی، آن را خراب کند. برای کمک به آماده شدن برای مهاجرت، شما را با تمام جدیدترین ویژگی ها آشنا می کنیم.

تغییر نسخه پی اچ پی

مشتریان Hostinger می توانند این مراحل را برای به روز رسانی نسخه PHP خود دنبال کنند:

  1. وارد hPanel شوید و داشبورد حساب میزبانی خود را باز کنید .
  2. در قسمت Advanced ، روی PHP Configuration کلیک کنید .
  3. تب PHP Version نشان می دهد که از کدام PHP استفاده می کنید. برای به روز رسانی آن به آخرین نسخه، PHP 8.0 را انتخاب کنید و ذخیره را فشار دهید .
PHP 8.0: معرفی نسخه جدید PHP

توجه داشته باشید که تکمیل به روز رسانی ممکن است چند دقیقه طول بکشد و باعث شود وب سایت شما به طور موقت در دسترس نباشد.

موارد جدید در PHP 8.0

تغییرات زیادی در کیفیت زندگی با به‌روزرسانی جدید در کنار بسیاری از ویژگی‌های کاملاً جدید وجود دارد. بیایید بررسی کنیم که چه چیزهای جدید و چه چیزی در PHP 8.0 در حال تغییر است.

کامپایلر JIT (Just-in-Time).

کامپایلر JIT یکی از هیجان انگیزترین به روز رسانی های PHP 8.0 است. هدف این ویژگی کار با opcache برای بهبود عملکرد در اجرای اسکریپت است.

JIT چیست؟

JIT مخفف عبارت just-in-time ، اپکد را قبل از اینکه برای خروجی اجرا شود در کد ماشین کامپایل می کند. برای درک اینکه این به چه معناست و چگونه کار می کند، باید مراحل اجرای اسکریپت PHP را درک کنیم:

  • تحلیل واژگانی. Zend Engine، مفسر PHP، کد را به توکن های قابل خواندن توسط ماشین ترجمه می کند.
  • تجزیه کننده. مفسر نشانه‌ها را تجزیه می‌کند تا یک درخت نحو انتزاعی (AST) ایجاد کند – یک نمایش درخت مانند که نحوه عملکرد کد را نشان می‌دهد.
  • تلفیقی. مفسر گره های AST را به کد عملیاتی تبدیل می کند که یک دستورالعمل قابل خواندن توسط ماشین است که به ماشین مجازی Zend (VM) می گوید که چه عملیاتی را انجام دهد.
  • اجرا. مفسر کد عملیاتی را به Zend VM تحویل می‌دهد، که اوپکد را برای اجرا در کد ماشین کامپایل می‌کند.

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

به همین دلیل PHP 5.5 پسوند opcache را معرفی کرد که کدهای opcache را از مرحله کامپایل ذخیره می کند.

هنگامی که سرور یک درخواست جدید برای همان اسکریپت دریافت می کند، مفسر می تواند بلافاصله کد عملیاتی را از opcache اجرا کند. به این ترتیب، نیازی به راه اندازی مجدد فرآیند اجرا از ابتدا نیست.

PHP 7.4 چندین سال بعد یک ویژگی پیش بارگذاری را اضافه کرد تا اسکریپت های پیش کامپایل opcache را در هنگام راه اندازی به کد عملیاتی تبدیل کند. در نتیجه، مفسر می تواند بلافاصله زمانی که سرور برای اولین بار درخواستی برای اسکریپت دریافت می کند، کد عملیات را برای اجرا تحویل دهد.

با وجود این مزایا، چندین جنبه منفی نیز وجود دارد. یکی این است که در پایان فرآیند، Zend VM هنوز باید قبل از اجرای آن کد opcode را به کد ماشین تبدیل کند، که می تواند زمان و منابع قابل توجهی را بگیرد.

اینجاست که کامپایلر JIT وارد می شود. او کد عملیاتی را در اولین اجرا به کد ماشین کامپایل می کند تا برای اجرای بعدی آماده شود.

هنگامی که درخواستی برای یک اسکریپت کامپایل شده توسط JIT وجود دارد، PHP آن را مستقیماً توسط CPU به جای Zend VM اجرا می‌کند و در نتیجه عملکرد سریع‌تری دارد. مراحل اجرای اسکریپت در PHP 8.0 در مقایسه با نسخه قبلی چگونه خواهد بود:

دو موتور کامپایل JIT وجود دارد:

  • عملکرد. این رویکرد یک تابع کامل را شناسایی و کامپایل می کند بدون اینکه بفهمد کدام قسمت ها اغلب فراخوانی می شوند.
  • ردیابی. این حالت فقط قسمت هایی را که اغلب در عملکرد استفاده می شوند تجزیه و تحلیل و کامپایل می کند تا در زمان و حافظه صرفه جویی شود. این موتور پیش فرض PHP 8.0 است.

JIT برای من چه معنایی دارد؟

با توجه به RFC ، فعال کردن JIT مهمترین راه برای بهبود عملکرد PHP است. نادیده گرفتن این ویژگی ممکن است منجر به از دست دادن یک مزیت بزرگ شود.

خوشبختانه، آزمایش‌های اخیر نشان می‌دهد که کامپایلر JIT توانسته است فرآیند اجرای اسکریپت را بهبود بخشد – عمدتاً اگر از موتور Tracing استفاده می‌کنید.

بنچمارک های مصنوعی PHP پس از فعال کردن حالت Tracing، سه برابر افزایش سرعت را نشان دادند. در برنامه های طولانی مدت، می توانید انتظار داشته باشید که تا دو برابر بهبود عملکرد داشته باشید.

PHP 8.0: معرفی نسخه جدید PHP

برای کاربران و توسعه‌دهندگان وردپرس، کامپایلر JIT می‌تواند تقویت جزئی را نیز اضافه کند، اگرچه ممکن است چندان قابل توجه نباشد.

شما باید TTFB را کاهش دهید، پایگاه داده را بهینه کنید و تعداد درخواست های HTTP را کاهش دهید تا بهترین عملکرد ممکن را داشته باشید. با این حال، توسعه‌دهندگان PHP با استفاده از پروفایل‌سازی و بهینه‌سازی‌های احتمالی به تلاش‌های بهبود خود ادامه خواهند داد.

اگر می خواهید JIT را فعال کنید، مطمئن شوید که پسوند opcache فعال است.

مشتریان برنامه میزبانی مشترک می توانند این کار را با باز کردن داشبورد حساب میزبانی -> پیکربندی PHP انجام دهند. در تب PHP Extensions ، حتماً کادر opcache را علامت بزنید .

PHP 8.0: معرفی نسخه جدید PHP

ویژگی های جدید در PHP 8.0

علاوه بر JIT چندین ویژگی هیجان انگیز وجود دارد. در این بخش مروری بر اضافات و تغییرات عمده به PHP 8.0 ارائه خواهد شد.

Union Types 2.0

در بسیاری از موارد، یک تابع می‌تواند از بیش از یک نوع استفاده کند، اما تعیین این مورد در نسخه‌های قبلی PHP ممکن نبود، مگر اینکه انواع را با استفاده از DocComments اعلام کنید.

در اینجا نمونه ای از آنچه به نظر می رسد آورده شده است:

شماره کلاس {< font >< /font >
/**<font></font>
* @var int| float $number<font></font>
*/ < font >< /font >
خصوصی $شماره; < font >< /font >
< font >< /font >
/**<font></font>
* @param int| float $number<font></font>
*/ < font >< /font >
تابع عمومی setNumber ( $number ) {< font >< /font >
$ this > number = $number; < font >< /font >
< font >< /font >
< font >< /font >
/**<font></font>
* @return int|float<font></font>
*/ < font >< /font >
تابع عمومی getNumber () {< font >< /font >
برگردان $ this > number; < font >< /font >
< font >< /font >
< font >< /font >

نسخه‌های قبلی PHP دو نوع اتحادیه خاص را معرفی کردند – Nullable (با استفاده از نحو ?Type ) و Iterable (برای آرایه و قابل عبور ).

با این حال، چیزی که وجود نداشت، پشتیبانی بومی از انواع اتحادیه دلخواه بود، که یک ویژگی است که با PHP 8.0 ارائه می شود.

اکنون می‌توانید انواعی را که تابع می‌تواند استفاده کند بنویسید و با استفاده از نحو T1|T2|… آنها را جدا کنید ، مانند:

شماره کلاس {< font >< /font >
private int|float $number; < font >< /font >
< font >< /font >
تابع عمومی setNumber ( int| float $number ) : void {< font >< /font >
$ this > number = $number; < font >< /font >
< font >< /font >
< font >< /font >
تابع عمومی getNumber () : int|float {< font >< /font >
برگردان $ this > number; < font >< /font >
< font >< /font >
< font >< /font >

توجه داشته باشید که این مثال دیگر شامل @var ، @param ، یا @return نمی‌شود، و کد را بسیار تمیزتر می‌کند.

می‌توانید از انواع اتحادیه برای ویژگی‌ها، آرگومان‌ها و انواع برگشتی استفاده کنید – هرچند محدودیت‌هایی وجود دارد که باید به آنها توجه کنید. برای اطلاعات بیشتر RFC را بررسی کنید .

آرگومان های نامگذاری شده

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

array_fill ( 0 , 100 , 50 ) ;

یکی از چالش های این است که ممکن است ترتیب پارامترها را به خاطر نداشته باشید. بعلاوه، درک اینکه هر کدام به چه چیزی در هنگام بازدید مجدد از کد اشاره می کنند، می تواند دشوار باشد.

با PHP 8.0، می‌توانید نامی را در کنار پارامتر اضافه کنید تا بتوانید آن را به یک تابع ارسال کنید. این چیزی است که معمولاً به نظر می رسد:

// استفاده از آرگومان های موقعیتی:<font></font>
array_fill ( 0 , 100 , 50 ) ; < font >< /font >
// استفاده از آرگومان های نامگذاری شده:<font></font>
array_fill ( start_index: 0 , num: 100 , value: 50 ) ;

یکی از مزایای این ویژگی این است که یادگیری عملکرد هر پارامتر، روند کلی را بسیار سریعتر می کند.

علاوه بر این، آرگومان‌های نام‌گذاری‌شده مستقل از ترتیب هستند، بنابراین لازم نیست موقعیت‌های ترتیب هر پارامتر را در اعلان‌های آن‌ها به خاطر بسپارید. بنابراین، مثال زیر همان معنای بالا را خواهد داشت:

array_fill ( مقدار: 50 , تعداد: 100 , start_index: 0 ) ;

اختلاط آرگومان های نامی و موضعی نیز امکان پذیر است، تا زمانی که موارد نام برده در رتبه دوم قرار گیرند. به عبارت دیگر کد زیر قابل قبول است:

test ( $foo, param: $bar ) ;

از طرف دیگر، این منجر به یک خطا می شود:

test ( پارامتر: $bar, $foo ) ;

در نهایت، با آرگومان های نامگذاری شده، فقط باید پارامترهایی را بنویسید که می خواهید مقادیر پیش فرض آنها را بازنویسی کنید. به راحتی از آنهایی که مقادیر پیش فرضی دارند که می خواهید حفظ کنید صرف نظر کنید. در اینجا یک مثال ارائه شده در RFC آورده شده است :

htmlspecialchars ( $string، پیش‌فرض، پیش‌فرض، false ) ; < font >< /font >
// در مقابل<font></font>
htmlspecialchars ( $string, double_encode: false ) ;

نحو استاندارد برای آرگومان های نامگذاری شده paramName: $value است. نام را به صورت پویا همانطور که در زیر نشان داده شده است ننویسید زیرا منجر به خطا می شود.

// پشتیبانی نمی شود.<font></font>
function_name ( $variableStoringParamName: $value ) ;

مطابقت عبارات

یک عبارت تطبیق شبیه یک عبارت switch است زیرا هدف آن مقایسه چندین مقدار است. با این حال، معناشناسی بسیار کارآمدتر و کمتر مستعد خطا است.

مثال دستور سوئیچ زیر را از RFC در نظر بگیرید :

سوئیچ ( $ this > lexer- > lookahead [ ‘type’ ]) {< font >< /font >
case Lexer::T_SELECT: < font >< /font >
$statement = $ this > SelectStatement () ; < font >< /font >
زنگ تفريح؛ < font >< /font >
< font >< /font >
case Lexer::T_UPDATE: < font >< /font >
$statement = $ this > UpdateStatement () ; < font >< /font >
زنگ تفريح؛ < font >< /font >
< font >< /font >
case Lexer::T_DELETE: < font >< /font >
$statement = $ this > DeleteStatement () ; < font >< /font >
زنگ تفريح؛ < font >< /font >
< font >< /font >
پیش فرض: < font >< /font >
$ this > syntaxError ( ‘SELECT, UPDATE or DELETE’ ) ; < font >< /font >
زنگ تفريح؛ < font >< /font >
}

با عبارت مطابقت، همان عبارت بسیار کوتاهتر به نظر می رسد:

$statement = match ( $ this > lexer- > lookahead [ ‘type’ ]) {< font >< /font >
Lexer::T_SELECT = > $ this > SelectStatement () , < font >< /font >
Lexer::T_UPDATE = > $ this > UpdateStatement () , < font >< /font >
Lexer::T_DELETE = > $ this > DeleteStatement () , < font >< /font >
default = > $ this > syntaxError ( ‘SELECT, UPDATE or DELETE’ ) , < font >< /font >
} ;

بلوک کد بالا نشان می دهد که عبارت مطابقت می تواند مقداری را برگرداند. این برخلاف دستور سوئیچ است که در آن شما باید $result را به انتهای آن اختصاص دهید.

علاوه بر این، نیازی به اضافه کردن یک استراحت بعد از هر بازو نیست زیرا به طور ضمنی اجرا شده است.

علاوه بر این، این ویژگی یک مقایسه دقیق “===” را به جای “==” آزاد انجام می دهد. 

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

سوئیچ ( ‘foo’ ) {< font >< /font >
مورد 0 : < font >< /font >
$result = “اوه نه!\n” ; < font >< /font >
زنگ تفريح؛ < font >< /font >
case ‘foo’ : < font >< /font >
$result = “این چیزی است که من انتظار داشتم\n” ; < font >< /font >
زنگ تفريح؛ < font >< /font >
< font >< /font >
echo $result; < font >< /font >
//> اوه نه!

یک عبارت تطبیق نتیجه مناسب تری ارائه می دهد:

echo match ( ‘foo’ ) {< font >< /font >
0 = > “اوه نه!\n” , < font >< /font >
‘foo’ = > “این چیزی است که انتظار داشتم\n” , < font >< /font >
} ; < font >< /font >
//> این همان چیزی است که من انتظار داشتم

نکته مهمی که هنگام استفاده از این ویژگی باید به خاطر داشته باشید این است که یکی از بازوها باید دارای مقداری باشد که با شرایط مطابقت داشته باشد. متناوبا، باید یک پیش فرض اعلام شده باشد. در غیر این صورت یک UnhandledMatchError ایجاد می کند.

ویژگی های

یک ویژگی یک تابع فراداده است که می تواند معنای بخشی از کد را مستند کند. توسعه دهندگان می توانند آن را در توابع، کلاس ها، ثابت های کلاس، خصوصیات کلاس، متدهای کلاس و پارامترهای تابع یا متد قرار دهند.

این ویژگی مشابه DocComments است، اگرچه تفاوت هایی نیز وجود دارد.

در مرحله اول، این واقعیت که این سیستم بومی سیستم PHP است، آن را با ابزارهایی مانند تحلیلگرهای استاتیک و برجسته کننده های نحوی قابل خواندن می کند. به همین دلیل است که RFC ویژگی ها را به عنوان شکل ساختارمندتر و نحوی فراداده پیشنهاد می کند.

برای نشان دادن صفات، متن را بین دو علامت کوچکتر و بزرگتر از جمله <<مثال>> قرار دهید .

 می توانید آنها را قبل از اعلان هایی که مشخص می کنند اضافه کنید، مانند:

<< ExampleAttribute >>< font >< /font >
class Foo < font >< /font >
{< فونت >< /font >
<< ExampleAttribute >>< font >< /font >
public const FOO = ‘foo’ ; < font >< /font >
< font >< /font >
<< ExampleAttribute >>< font >< /font >
عمومی $x; < font >< /font >
< font >< /font >
<< ExampleAttribute >>< font >< /font >
عملکرد عمومی foo (<< ExampleAttribute >> $bar ) { }< font >< /font >
}

علاوه بر این، کاربران می‌توانند یک یا چند مقدار مرتبط را در ویژگی اضافه کنند، همانطور که در زیر نشان داده شده است:

<< WithoutArgument >>< font >< /font >
<< SingleArgument ( 0 )>>< font >< /font >
<< FewArguments ( ‘Hello’ , ‘World’ )>>< font >< /font >
تابع Foo () {}

همچنین امکان پیوست کردن ویژگی‌ها قبل یا بعد از DocComment وجود دارد.

<< ExampleAttribute >>< font >< /font >
/** docblock */ < font >< /font >
<< AnotherExampleAttribute >>< font >< /font >
تابع Foo () {}

ارتقای املاک سازنده

این ویژگی یک سینتکس کوتاه نویسی جدید است که هدف آن کاهش مقدار دیگ بخار هنگام استفاده از تابع سازنده است.

در نسخه‌های قبلی پی‌اچ‌پی، می‌توان اشیاء با ارزش ساده را با تکرار ویژگی‌ها تعریف کرد – یک بار در اعلان ویژگی، یک بار در پارامترهای سازنده و دو بار در تخصیص خصوصیات. به مثال زیر توجه کنید:

class Point {< font >< /font >
شناور عمومی $x; < font >< /font >
شناور عمومی $y; < font >< /font >
شناور عمومی $z; < font >< /font >
< font >< /font >
تابع عمومی __construct (< font >< /font >
float $x = 0 . 0 , < font >< /font >
float $y = 0 . 0 , < font >< /font >
شناور $z = 0 . 0 , < font >< /font >
) {< font >< /font >
$ this > x = $x; < font >< /font >
$ this > y = $y; < font >< /font >
$ this > z = $z; < font >< /font >
< font >< /font >
}

با PHP 8.0، می‌توانید ویژگی را یک بار اعلام کنید و آن را با امضای سازنده ترکیب کنید و تجربه کدنویسی مؤثرتری را ارائه دهید.

class Point {< font >< /font >
تابع عمومی __construct (< font >< /font >
شناور عمومی $x = 0 . 0 , < font >< /font >
شناور عمومی $y = 0 . 0 , < font >< /font >
شناور عمومی $z = 0 . 0 , < font >< /font >
) {}< font >< /font >
}

اسکریپت مانند نمونه قبلی اجرا خواهد شد. اگر پیشوند پارامترها با یک نشانگر قابل مشاهده باشد، PHP نحو را به نسخه سنتی ترجمه کرده و پس از آن اجرا می کند.

RFC توضیح می دهد که چندین محدودیت وجود دارد که باید در مورد تبلیغات دارایی سازنده در نظر گرفته شود. یکی این است که از استفاده از کلمات کلیدی var خودداری کنید، زیرا این ویژگی از قبل نیاز به ارتقای ویژگی ها با استفاده از نشانگر دید دارد.

کلاس تست {< font >< /font >
// خطا: کلمه کلیدی “var” پشتیبانی نمی شود.<font></font>
تابع عمومی __construct ( var $prop ) {}< font >< /font >
}

ثانیاً، وقتی نوع null است، باید به صراحت با استفاده از نحو nullable ?Type اعلام شود.

کلاس تست {< font >< /font >
// خطا: استفاده از پیش فرض null در ویژگی غیر قابل تهی<font></font>
تابع عمومی __construct ( نوع عمومی $prop = null ) {}< font >< /font >
// Correct: به جای آن نوع را به طور واضح باطل کنید<font></font>
تابع عمومی __construct ( عمومی ? نوع $prop = null ) {}< font >< /font >
}

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

// خطا: سازنده نیست.<font></font>
تست تابع ( $x خصوصی ) {}< font >< /font >
کلاس انتزاعی تست {< font >< /font >
// خطا: سازنده Abstract.<font></font>
تابع عمومی انتزاعی __construct ( خصوصی $x ) ; < font >< /font >
}

یک کلاس می‌تواند هم ویژگی‌های ارتقا یافته توسط سازنده و هم اعلان‌های ویژگی صریح داشته باشد. با این حال، امکان استفاده از یک ویژگی در هر دو وجود ندارد، مانند:

کلاس تست {< font >< /font >
عمومی $prop; < font >< /font >
< font >< /font >
// خطا: اعلام مجدد دارایی.<font></font>
تابع عمومی __construct ( public $prop ) {}< font >< /font >
}

همچنین هیچ پارامتر متغیر ارتقا دهنده ای در سازنده ها وجود ندارد.

کلاس تست {< font >< /font >
// خطا: پارامتر Variadic.<font></font>
تابع عمومی __construct ( رشته عمومی …$strings ) {}< font >< /font >
}

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

کلاس تست {< font >< /font >
// خطا: نوع قابل فراخوانی برای ویژگی ها پشتیبانی نمی شود.<font></font>
تابع عمومی __construct ( قابل فراخوان عمومی $callback ) {}< font >< /font >
}

اپراتور Nullsafe

بررسی تهی با استفاده از یک دستور شرطی معمولاً منجر به کدهایی می شود که عمیقاً تو در تو قرار دارند و خواندن آن دشوار است. به مثال زیر توجه کنید:

$country = null ; < font >< /font >
< font >< /font >
if ( $session !== null ) {< font >< /font >
$user = $session- > user; < font >< /font >
< font >< /font >
if ( $user !== null ) {< font >< /font >
$address = $user- > getAddress () ; < font >< /font >
< font >< /font >
if ( $address !== null ) {< font >< /font >
$country = $address- > کشور; < font >< /font >
< font >< /font >
< font >< /font >
< font >< /font >
// با $country کاری انجام دهید

برای مبارزه با این مشکل، PHP 8.0 عملگر nullsafe را ارائه می‌کند .

با استفاده از این ویژگی می توانید کدهای مثال بالا را با استفاده از نحو ?-> بازنویسی کنید.

$country = $session?- > user?- > getAddress () ?- > country; < font >< /font >
// با $country کاری انجام دهید

طبق RFC ، PHP بررسی می‌کند که آیا اولین عملگر $session صفر است یا خیر. اگر نشد، اجرا تا آخرین اپراتور ادامه خواهد داشت. PHP زمانی که یکی از اپراتورها null را ارزیابی کند، فرآیند اجرا را متوقف می کند.

یکی از محدودیت‌های استفاده از عملگر nullsafe این است که نمی‌تواند در زمینه نوشتن وجود داشته باشد. در نتیجه موارد زیر یک خطا ایجاد می کند:

foreach ([ 1 , 2 , 3 ] به عنوان $foo?- > bar- > baz ) {}< font >< /font >
// نمی توان از عملگر nullsafe در زمینه نوشتن استفاده کرد

علاوه بر این، گرفتن مرجع از یک زنجیره تهی مجاز نیست.

// 1<font></font>
$x = &$foo?- > نوار; < font >< /font >
// خطای کامپایلر: نمی توان به یک زنجیره تهی ارجاع داد<font></font>
// 2<font></font>
take_ref ( $foo?- > bar ) ; < font >< /font >
// خطا: نمی توان پارامتر 1 را با مرجع <font></font> ارسال کرد
// 3<font></font>
function & return_by_ref ( $foo ) {< font >< /font >
بازگشت $foo?- > bar; < font >< /font >
// خطای کامپایلر: نمی توان به یک زنجیره تهی ارجاع داد<font></font>
}

نقشه های ضعیف

با PHP 7.4، توسعه‌دهندگان می‌توانند ارجاعات ضعیفی به یک شی کلیدی داشته باشند تا برخلاف روابط قوی، شمارنده مرجع شی را افزایش ندهند و از حذف شی در زمانی که دیگر استفاده نمی‌شود، جلوگیری کنند.

یک نقشه ضعیف بهبود این ویژگی است. مقادیر دلخواه مورد استفاده به عنوان ارجاعات ضعیف به یک شی را ذخیره می کند. به این ترتیب، هنگامی که شی از محدوده خارج می شود یا تنظیم نمی شود، PHP می تواند هر مقدار مرتبط را در نقشه ضعیف پاک کند.

مثال زیر که از RFC تهیه شده است ، نشان می دهد که نقشه های ضعیف چگونه به نظر می رسند:

$map = WeakMap جدید . < font >< /font >
$obj = stdClass جدید ; < font >< /font >
$map [ $obj ] = 42 ; < font >< /font >
var_dump ( $map ) ; < font >< /font >
// object(WeakMap)#1 (1) {<font></font>
// [0]=><font></font>
// آرایه(2) {<font></font>
// [“key”]=><font></font>
// object(stdClass)#2 (0) {<font></font>
// <font></font>
// [“value”]=><font></font>
// int(42)<font></font>
// <font></font>
// <font></font>
< font >< /font >
// شی در اینجا از بین می رود و کلید به طور خودکار از نقشه ضعیف حذف می شود.<font></font>
unset ( $obj ) ; < font >< /font >
var_dump ( $map ) ; < font >< /font >
// object(WeakMap)#1 (0) {<font></font>
//}

این ویژگی برای برنامه های طولانی مدت مفیدتر خواهد بود، به خصوص اگر می خواهید از نشت حافظه جلوگیری کنید و کش را پیاده سازی کنید.

ویژگی های جزئی جدید

در اینجا چند ویژگی اضافی جزئی وجود دارد که می توانید در PHP 8.0 انتظار داشته باشید:

  • کاماهای دنباله دار در لیست پارامترها. شما می توانید پارامترها را در قالب عمودی به جای فرمت افقی استاندارد فهرست کنید.
  • str_contains(). این تابع بررسی می کند که آیا یک رشته به عنوان عنصری از رشته دیگر گنجانده شده است یا خیر. بسته به درست یا نادرست بودن شرط، مقدار بولی را برمی گرداند. شما ممکن است آن را به عنوان یک جایگزین قابل خواندن تر برای str_pos() در نظر بگیرید.
  • str_starts_with(). بررسی می کند که آیا یک رشته با یک زیررشته مشخص شروع می شود یا خیر.
  • str_ends_with(). تعیین می کند که آیا یک رشته با یک زیررشته مشخص به پایان می رسد یا خیر.
  • رابط رشته ای کلاس هایی که از متد __toString () استفاده می کنند، اکنون رابط Stringable را به طور خودکار پیاده سازی می کنند. هدف اجازه دادن به string|Stringable union نوع است، به این معنی که PHP می تواند یک رشته یا یک شی را با استفاده از متد __toString() بپذیرد .
  • fdiv(). PHP 8.0 تقسیم بر صفر را می پذیرد و به جای خطا، INF، -INF یا NAN را برمی گرداند.
  • get_debug_type(). این تابع مشابه gettype() عمل می‌کند ، اگرچه نام‌های نوع بومی و نام کلاس‌ها را برمی‌گرداند. جدول مرجع زیر تفاوت این دو را نشان می دهد.
  • get_resource_id(). این تابع یک جایگزین امن برای (int) $ است. شناسه یک منبع خارجی مانند اتصال پایگاه داده را دریافت می کند.
  • PhpToken::tokenize(). این متد جایگزین تابع ()token_get_all خواهد شد . به جای برگرداندن رشته ها یا آرایه های مقادیر، آرایه ای از اشیا را برمی گرداند. کد به دست آمده قابل خواندن و حافظه کارآمدتر خواهد بود.
  • استاندارد زندگی DOM جدید در ext/dom. رابط‌های جدید و ویژگی‌های عمومی برای انطباق با API‌های DOM فعلی، که هنگام برخورد با اسناد XML و HTML ضروری شده‌اند.

ویژگی های منسوخ شده در PHP 8.0

PHP 8.0 ویژگی های زیر را از بین می برد:

  • گنجاندن یک مقدار پیش فرض در یک پارامتر و به دنبال آن یک پارامتر مورد نیاز، زیرا مقدار پیش فرض تاثیری ندارد
  • استفاده از get_defined_functions() با exclude_disabled که به صراحت روی false تنظیم شده است
  • تابع enchant_broker_set_dict_path().
  • تابع enchant_broker_get_dict_path().
  • تابع () enchant_dict_add_to_personal
  • تابع enchant_dict_is_in_session().
  • تابع () enchant_broker_free
  • تابع () enchant_broker_free_dict
  • ثابت ENCHANT_MYSPELL
  • ثابت ENCHANT_ISPELL
  • تابع libxml_disable_entity_loader().
  • ثابت PGSQL_LIBPQ_VERSION_STR به همراه برخی از توابع مستعار در پسوند pgsql
  • استفاده از توابع مقایسه مرتب‌سازی که درست یا نادرست را برمی‌گردانند
  • استفاده از یک فایل خالی به عنوان ZipArchive
  • API رویه ای Zip
  • تابع ReflectionFunction::isDisabled().
  • تابع ReflectionParameter::getClass().
  • تابع ReflectionParameter::isArray().
  • تابع ReflectionParameter::isCallable().

برای اطلاعات بیشتر در مورد ویژگی های منسوخ شده  ، این منبع را بررسی کنید.

تغییرات ناسازگار به عقب برای PHP 8.0

مهاجرت به PHP 8.0 تغییرات زیادی را به همراه دارد که با نسخه های قدیمی PHP ناسازگار است. برخی از آنها عبارتند از:

  • مقایسه رشته به عدد مقایسه اعداد با رشته های غیر عددی اکنون به عنوان false برمی گردد. جدول مرجع زیر را ببینید:
PHP 8.0: معرفی نسخه جدید PHP
  • بدون فضای خالی در نام های فضای نام. به عنوان مثال، نام هایی مانند “Foo \ bar” قابل قبول نیستند. به جای آن از “Foo\bar” استفاده کنید.
  • منبع برای مهاجرت شی اکنون برخی از توابع به جای منبع، یک شی را برمی گردانند.
  • حذف پرچم‌های FILTER_FLAG_SCHEME_REQUIRED و FILTER_FLAG_HOST_REQUIRED . این به این دلیل است که FILTER_VALIDATE_URL در حال حاضر از این پرچم‌ها به طور پیش‌فرض زمانی که با تابع filter_var() ترکیب می‌شود، استفاده می‌کند.
  • E_ALL اکنون سطح پیش‌فرض error_reporting است. PHP 8.0 شامل اعلامیه ها و تغییرات منسوخ شده در پیام های خطا می شود.

حتماً اسناد رسمی را بخوانید تا سایر تغییرات ناسازگار را ببینید.

سایر تغییرات PHP 8.0

تغییرات زیر منجر به ناسازگاری با عقب نخواهند شد، اما توجه به آنها همچنان ضروری است. برخی از آنها عبارتند از:

  • می توانید نتایج ReflectionClass::getConstants() و ReflectionClass::getReflectionConstants() را با استفاده از پارامتر فیلتر جدید فیلتر کنید.
  • متدهای ZipArchive:: addGlob () و ZipArchive::addPattern() اکنون flags ، comp_method ، comp_flags ، env_method و enc_password را در آرایه  گزینه ها می پذیرند.
  • یک آرگومان پرچم جدید برای متدهای ZipArchive::addEmptyDir ، ZipArchive::addFile() و ZipArchive::addFromString() وجود دارد.
  • به دلیل نقش اساسی آن در PHP، پسوند JSON اکنون به طور پیش فرض فعال است.
  • اگر آرایه شکاف نداشته باشد، تابع ()array_slice نیازی به پیدا کردن موقعیت شروع نخواهد داشت.

این منبع حاوی اطلاعات بیشتری در مورد تغییرات است.

وردپرس و PHP 8.0

وردپرس 5.6 و بالاتر با PHP 8.0 سازگار است. تیم توسعه بسیاری از ویژگی های منسوخ شده را برای رسیدن به این هدف حذف کرده است.

با این حال، آنها نمی توانند ادعای سازگاری کامل داشته باشند زیرا بسیاری از افزونه ها و تم ها ممکن است هنوز از PHP 8.0 پشتیبانی نکنند. اگر می خواهید به PHP 8.0 تغییر دهید، مطمئن شوید که می توانید بدون هیچ مشکلی این انتقال را انجام دهید. در غیر این صورت، اگر با یک توسعه‌دهنده وب حرفه‌ای کار می‌کنید، از آن‌ها بخواهید که در انتقال به شما کمک کنند.

اگر یک توسعه دهنده پلاگین یا تم هستید

، وردپرس تشویق می کند که کد محصول خود را با نسخه جدید PHP تطبیق دهید. به این ترتیب، کاربران پلاگین یا تم در صورت به روز رسانی نرم افزار، در وب سایت خود با مشکل مواجه نخواهند شد.

این مقاله تغییرات عمده ای را که ممکن است برای توسعه دهندگان وردپرس اعمال شود، تشریح کرده است. با این حال، توصیه می کنیم این اطلاعیه وردپرس را بخوانید تا ببینید به کدام یک باید توجه ویژه ای داشته باشید.

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

نتیجه

PHP 8.0 تغییرات و بهبودهای هیجان انگیزی برای توسعه دهندگان PHP دارد، مانند کامپایلر JIT، ارتقاء ویژگی سازنده و نقشه های ضعیف. انتظار افزایش عملکرد وب سایت و تجربه کدنویسی را داشته باشید.

حتماً RFC ها و مستندات را بررسی کنید تا پروژه های شما کاملاً با آخرین نسخه PHP سازگار باشد. موفق باشید!

دیدگاهتان را بنویسید