فقط چند (10) روز دیگر تا انتشار نسخه 8 PHP فاصله داریم.
امروز 2020 8 June
انتشار اولیه June 18 2020
جدول برنامه ریزی انتشار PHP 8 در سایت PHP.net
از آنجا که می دانیم PHP 7 بسیار جذاب است ، پیشرفت های چشمگیری را نسبت به PHP 5 دارد ، یا از نظر سرعت یا عملکرد صحبت می کنیم. همچنین ، آن را برای ما به ارمغان می آورد.
با این حال ، این اشتباه است که بگوییم یک زبان کامل و بدون نقص است بنابراین ، وقتی صحبت از PHP 8 می شود ، انتظارات کاربران بسیار زیاد است. خوب ، جایی که همه دوست دارند PHP 8 را ببینند ، دارای ویژگی های واقعی تر است. به این دلیل است که این ویژگی به شما کمک می کند تا از زبان های دیگر در یک پروژه PHP استفاده نکنید و فقط به خاطر زمان واقعی است.
نسخه های قبلی PHP تا الان
تاکنون چندین نسخه از PHP تکامل یافته است. بنابراین ، اجازه دهید نسخه های PHP را که از قبل در بازار موجود است در اینجا بررسی کنیم.
1.0 هشتم ژوئن 1995
2.0 اول نوامبر 1997
3.0 ششم ژوئن 1998 تا 20 اکتبر 2000
4.0 در 22 مه 2000 تا 23 ژوئن 2001
4.1 دهم دسامبر 2001 تا 12 مارس 2002
4.2 در 22 آوریل 2002 تا ششم سپتامبر 2002
4.3 در 27 دسامبر 2002 تا 31 مارس 2005
4.4 یازدهم ژوئیه 2005 7th اوت 2008
5.0 سیزدهم ژوئیه 2004 تا 5 سپتامبر 2005
5.1 در 24 نوامبر 2005 تا 24 آگوست 2006
5.2 در 2 نوامبر 2006 تا ششم ژانویه 2011
5.3 در 30 ژوئن 2009 تا 14 آگوست 2014
5.4 اول مارس 2012 تا 3 سپتامبر 2015
5.5 در 20 ژوئن 2013 تا 21 ژوئیه 2016
5.6 در 28 آگوست 2014 تا 31 دسامبر 2018
7.0 در 3 دسامبر 2015 تا 3 دسامبر 2018
7.1 اول دسامبر 2016 تا اول دسامبر 2019
7.2 در 30 نوامبر 2017 تا 30 نوامبر 2020
7.3 در 6 دسامبر 2018 تا دسامبر 2021
حالت فقط در زمان (JIT) در 8 PHP
درست در زمان تلفیقی (Just in time) راهی برای بهینه سازی کد در حال اجرا است. این یک روش محبوب است که توسط ماشین مجازی جاوا (JVM) و همچنین محبوب V8 JavaScript VM از Google استفاده می شود. در حالی که هر دو از JIT استفاده می کنند.
در ابتدا توسعه PHP قبل از تکامل فعلی (PHP 7.x) بر بهبود عملکرد PHP با استفاده از JIT متمرکز بود. این تلاش باعث بهبود پیشرفتهای اقتصادی در معیارها شد ، اما ثابت شد که پیشرفتهای اندکی در برنامه های دنیای واقعی مانند وردپرس یا جوملا به همراه دارد.
پس از انجام کار برای PHP 7.0 و ارائه پیشرفت های چشمگیر در آن ، پیشرفت های عملکرد در نسخه های 7.1 و 7.2 نسبتاً متوسط بوده است. به همین دلیل این تیم دوباره در حال اجرای JIT بوده است.
از آنجا که PHP نرم افزاری منبع باز است ، توسعه دهندگان برای بارگیری و کامپایل کردن کد منبع رایگان هستند. با این حال ، بسیاری از مردم از احتمال کامپایل کردن نرم افزار خود جلوگیری می کنند. خوشبختانه ، یک تصویر Docker در دسترس است که به توسعه دهندگان امکان می دهد جدیدترین ساخته های PHP JIT را به راحتی امتحان کنند.
هر دو JIT و 8.0.0 در آینده از PHP جذاب هستند ، اما هر دو ویژگی قابل توجهی در آینده باقی می مانند. و به خصوص برای JIT ، مراحل کوتاه زندگی PHP برای اجرای JIT ایده آل نیست - این با فرآیندهای مداوم در حال اجرا مانند Node.js یا Java مقایسه می شود.
توضیح: JIT به اختصار رسیده کلمات Just In Time است، JIT یک تکنیک است که کدهای نرمافزار ما را در حال اجرا کامپایل (Compile) یا جمعآوری میکند که میتوان در عوض کامپایلرهای دیگر از آن استفاده کرد.
شاید تا به حال اسم JIT به گوشتان نخورده است پس اجازه دهید اول توضیح بدهیم که JIT چیست؟ شاید شما از قبل میدانستید که PHP یک زبان تفسیر شده است، به این معنا که کد شما قبل از اجرا شدن نیازی به کامپایل (Compile) شدن ندارد مثل زبانهای C و ++C. در عوض آن، PHP کد شما را میخواند و آن را اجرا میکند به عبارت دیگر شما کدی نمینویسید که درون کدهای سطح پایین کامپایل شود تا توسط کامپیوتر اجرا بشوند، اما شما یک سند (Script) از کدها را به PHP میدهید تا اجرا شوند.
چرا JIT در PHP معرفی شده است؟
همانطور که قبلاً نیز اشاره کردیم ، HHVM (زمان جایگزینی که فیس بوک توسعه داده و از آن استفاده می کند) از JIT استفاده می کند. در مقایسه با موتور رسمی PHP که در PHP 7.0 مستقر شده است ، حتی سریعتر و بهتر نیز می شود.
بنابراین ، به دلیل محبوبیت شدید HHVM یا تقاضای زیاد جامعه PHP در سراسر جهان ، مجدداً به جستجوی JIT Engine بروید ، گروه Zend و PHP برای این کار آماده هستند و همچنین مصمم هستند که آن را در نسخه اصلی بعدی PHP 8.0 معرفی کنند.
در حالی که کدی که در PHP 5 نوشته شده است در PHP 7 حتی بدون تغییر اجرا می شود ، به عنوان یک نتیجه ، عملکرد دو برابر می شود. این به دلیل تغییرات در موتور نیست بلکه بهینه سازی های دیگر در PHP 7.0 است.
از این رو ، می توانیم باور داشته باشیم که مطمئناً بروزرسانی در موتور باعث بهبود عملکرد در چین های مختلف می شود. همانطور که می دانیم استاندارد HHVM ، سطح عملکرد به راحتی می تواند دو برابر شود ، یا می توانیم بگوییم وقتی کلماتی که برای PHP 7 نوشته شده است در نسخه 8.0 پیاده سازی شود ، زمان اجرای آن نصف می شود.
از آنجا که بسیاری از پیاده سازی های چارچوب .Net و پیاده سازی جاوا از قبل به JIT وابسته هستند ، خوب است که PHP از ترکیب پویا استفاده کند و عملکرد آن را تا سطح بعدی افزایش دهد.
زبان PHP برای زمینه های غیر وب
علاوه بر آن PHP برای زبان سمت سرور یک گزینه کاملا مناسب در نظر گرفته شده است. PHP دیگر مثل گذشته کند نیست، زمانش رسیده است که به تواناییهای PHP اضافه کنیم مثل تحلیل و بررسی دادهها (Data analysis)، رندر (Render) کردن عکسهای سه بعدی (3D) و دو بعدی (2D).
در گذشته کدهایی با کارایی بالا توسط زبانهای برنامهنویسی C و ++C به جای پیکیج (Package) زبان PHP نوشته میشد. برای مثال phpredis همیشه 6 - 7 برابر از predis سریعتر است، اگر کد PHP به جای ترجمه شدن کامپایل بشود ما پکیجهای PHP را خواهیم داشت که همان سرعت و کارایی را دارند که با زبانهای برنامهنویسی مانند C و ++C نوشته شدهاند.
بنابراین کامپایلر JIT انتخاب شد چون جالبترین و بهترین جهت یا مسیر است.
توضیح: JIT کد عملیاتی (OpCode) را به کد ماشین کامپایل میکند و آنها را اجرا میکند اما دلایل مشکلات امنیتی این است که حافظه (Memory) یا باید قابل نوشتن (Writable) باشد یا قابل اجرا (Executable) شدن که به اصطلاح آنها را با علامتهای W^X نشان میدهند.
زمانی که PHP شروع به اجرا شدن میکند، سپری که مانع نوشتن یا Writable در JIT است را میتوان با استفاده از ()mprotect غیر فعال کرد، به این معناست که JIT شروع به کامپایل کردن کد میکند و آن را درون حافظه (Memory) مینویسد این سپر برای جلوگیری از بهرهبرداریهای احتمالی از آن در حین اجرا محافظت میکند تا غیر قابل نوشتن باشد.
برنامه های PHP چگونه Compiled می شوند؟
زبان PHP یک ماشین مجازی به اسم Zend VM دارد، چرا آن را ماشین مجازی صدا میزنیم؟ چون مثل کامپیوتر شما برای اجرا کردن کدها عمل میکند، بر اساس توضیح بالا خواندن و اجرا کردن کد بر عهدهی ماشین مجازی است. اما قبل از آن کد شما توسط PHP خوانده و به کدهای عملیاتی (Opcode) (کدهای عملیاتی یا Opcode زبانی است که Zend VM آن را متوجه میشود و توسط Zend Vm ترجمه میشوند) و بعد از آن Zend VM میتواند کدهای عملیاتی (Opcode) را ترجمه کند. در زیر شما یک تصویر را برای درک بیشتر مشاهده میکند.
برای اینکه compilation فقط در صورت لزوم اتفاق بیفتد ، JIT به عنوان یک بخش تقریباً مستقل از OPcache و افزونه ای برای ذخیره کردن opcodes اجرا می شود. علاوه بر این ، JIT دستورالعمل های ایجاد شده برای Zend VM را بعنوان نمایندگی واسطه در PHP درمان می کند. علاوه بر این ، برای ساخت میزبان کد به عنوان CPU به طور مستقیم و نه Zend VM ، سپس کد ماشین وابسته به معماری تولید می کند.
با توجه به نوع پویا تایپ شده در PHP ، موارد بسیاری وجود دارد که انواع اتحادیه ها می توانند مفید باشند. انواع اتحادیه مجموعه ای از دو یا چند نوع است که نشان می دهد که یکی از این موارد قابل استفاده است.
public function foo(Foo|Bar $input): int|float;
توجه داشته باشید که void
هرگز نمی تواند جزئی از نوع اتحادیه باشد ، زیرا نشان دهنده "ارزش بازگشتی به هیچ وجه" نیست. علاوه بر این ، nullable
اتحادیه ها را می توان با استفاده از |null
یا ?
نماد موجود نوشت :
public function foo(Foo|null $foo): void; public function bar(?Bar $bar): void;
ویژگی ها ، که معمولاً با زبان های دیگر به عنوان حاشیه نویسی شناخته می شوند ، راهی برای افزودن داده های متا به کلاس ها ، بدون نیاز به تجزیه جلد سند ، ارائه می دهد.
همانطور که برای یک نگاه سریع ، مثالی از آنچه که از ویژگی ها به نظر می رسد ، از RFC:
use App\Attributes\ExampleAttribute; <<ExampleAttribute>> class Foo { <<ExampleAttribute>> public const FOO = 'foo'; <<ExampleAttribute>> public $x; <<ExampleAttribute>> public function foo(<<ExampleAttribute>> $bar) { }}
<<PhpAttribute>> class ExampleAttribute { public $value; public function __construct($value) { $this->value = $value; }}
اگر می خواهید در چگونگی کارکرد صفات ، گشت و گذار کنید و چگونه می توانید خود را بسازید. می توانید در مورد این صفحات به عمق صفات مطالعه کنید.
این RFC برای ایجاد اشیاء با ارزش یا اشیاء انتقال داده ، قند نحوی را اضافه می کند. به جای مشخص کردن خصوصیات کلاس و سازنده برای آنها ، اکنون PHP می تواند آنها را در یک ترکیب کند.
به جای انجام این کار:
class Money { public Currency $currency; public int $amount; public function __construct( Currency $currency, int $amount, ) { $this->currency = $currency; $this->amount = $amount; }}
اکنون می توانید این کار را انجام دهید:
class Money { public function __construct( public Currency $currency, public int $amount, ) {}}
تغییرات زیادی در این نحو وجود دارد ، به RFC بروید تا در مورد آنها بخوانید.
static
نوع بازگشت جدید rfcاگرچه بازگشت از قبل امکان پذیر بود self
، static
تا زمان PHP 8 یک نوع بازگشت معتبر نبود. با توجه به طبیعت تایپ شده PHP ، این ویژگی است که برای بسیاری از توسعه دهندگان مفید خواهد بود.
class Foo { public function test(): static { return new static(); } }
نوع جدید rfc mixed
برخی ممکن است آن را یک شر ضروری بدانند: mixed
نوع باعث بسیاری از احساسات مختلط می شود. استدلال بسیار خوبی برای بیان آن وجود دارد: یک نوع از دست رفته می تواند به معنی چیزهای زیادی در PHP باشد:
به دلایل فوق ، چیز خوبی است که mixed
نوع آن اضافه می شود. mixed
خود به معنی یکی از این انواع است:
array
bool
callable
int
float
null
object
resource
string
توجه داشته باشید که mixed
می تواند به عنوان یک پارامتر یا نوع خاصیت استفاده شود ، نه فقط به عنوان یک نوع بازگشت.
همچنین توجه داشته باشید که از mixed
قبل شامل شده null
، مجاز نیست آن را باطل کند. موارد زیر خطایی را ایجاد می کند:
// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type. function bar(): ?mixed {}
این RFC throw
از بیانیه بودن به یک عبارت تغییر می کند ، و این باعث می شود که در بسیاری از مکان های جدید استثناء ایجاد شود:
$triggerError = fn () => throw new MyError(); $foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
با استفاده از RFC dobrefs که در PHP 7.4 اضافه شده است ، WeakMap
پیاده سازی ای در PHP 8. اضافه شده است. WeakMaps
اشیاء را ذکر کنید. اینها به اشیاء مراجعه کنید ، که از جمع آوری زباله جلوگیری نمی کند.
به عنوان مثال از ORM ها استفاده كنید ، آنها غالباً انبارهایی را اجرا می كنند كه برای بهبود عملكرد روابط بین موجودیت ها ، به كلاس های موجودیت مراجعه می كنند. این اشیاء موجودیت نمی توانند زباله جمع آوری شوند ، مادامی که این حافظه پنهان به آنها اشاره داشته باشد ، حتی اگر حافظه نهان تنها چیزی باشد که به آنها مراجعه می کند.
اگر این لایه حافظه نویسی به جای آن از منابع و نقشه های ضعیف استفاده کند ، PHP هنگامی که هیچ چیز دیگری به آنها اشاره نمی کند ، این اشیاء را جمع می کند. به ویژه در مورد ORM ها ، که می توانند صدها نفر را مدیریت کنند ، اگر نه هزاران شخص در یک درخواست. نقشه های ضعیف می توانند روشی بهتر و مناسب تر برای برخورد با این اشیاء را ارائه دهند.
در اینجا نقشه های ضعیف به نظر می رسد ، مثالی از RFC:
class Foo { private WeakMap $cache; public function getSomethingWithCaching(object $obj): object { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); }}
::class
به اشیاء rfcیک ویژگی کوچک و در عین حال مفید ، جدید: اکنون می توانید ::class
به جای استفاده از get_class()
آنها ، از اشیاء استفاده کنید. به همان روش کار می کند get_class()
.
$foo = new Foo(); var_dump($foo::class);
هر زمان که قبل از PHP 8 می خواستید یک استثنا را بدست آورید ، مجبور بودید که بدون توجه به اینکه از آن متغیر استفاده کرده اید ، آن را در یک متغیر ذخیره کنید. با استفاده از صیدهای بدون گرفتن ، می توانید متغیر را حذف کنید ، بنابراین به جای این موارد:
try { // Something goes wrong} catch (MySpecialException $exception) {Log::error("Something went wrong");}
اکنون می توانید این کار را انجام دهید:
try { // Something goes wrong} catch (MySpecialException) { Log::error("Something went wrong");}
توجه داشته باشید که لازم است همیشه نوع آن را مشخص کنید ، شما اجازه ندارید که خالی کنید catch
. اگر می خواهید همه موارد استثنا و خطا را بدست آورید ، می توانید Throwable
به عنوان نوع گیرنده از آن استفاده کنید .
در هنگام فراخوانی یک تابع از قبل امکان پذیر است ، هنوز پشتیبانی لیست کاما در لیست پارامترها وجود ندارد. اکنون در PHP 8 مجاز است ، به این معنی که می توانید موارد زیر را انجام دهید:
public function( string $parameterA, int $parameterB, Foo $objectfoo,) { // …}
در حال حاضر می توانید با DateTime
استفاده از یک DateTimeImmutable
شیء یک شی ایجاد کنید DateTime::createFromImmutable($immutableDateTime)
، اما روش دیگر مشکل بود. با اضافه کردن DateTime::createFromInterface()
و DatetimeImmutable::createFromInterface()
اکنون یک روش کلی برای تبدیل DateTime
و DateTimeImmutable
اشیاء به یکدیگر وجود دارد.
DateTime::createFromInterface(DateTimeInterface $other); DateTimeImmutable::createFromInterface(DateTimeInterface $other);
توضیح: Stringable
رابط می توان برای تایپ هر چیزی اشاره است که یک رشته و یا ابزار __toString()
. علاوه بر این ، هر زمان که کلاس پیاده سازی می کند __toString()
، به طور خودکار رابط پشت صحنه را پیاده سازی می کند و نیازی به اجرای دستی آن نیست.
class Foo { public function __toString(): string { return 'foo'; }} function bar(Stringable $stringable) { /* … */ } bar(new Foo()); bar('abc');
str_contains()
عملکرد جدید rfcبرخی ممکن است بگویند مدت زمان طولانی است ، اما ما در نهایت لازم نیست که دیگر به آن اعتماد strpos
کنیم تا بدانیم که یک رشته شامل رشته دیگری است یا خیر.
به جای انجام این کار:
if (strpos('string with lots of words', 'words') !== false) { /* … */ }
اکنون می توانید این کار را انجام دهید
if (str_contains('string with lots of words', 'words')) { /* … */ }
str_starts_with()
و str_ends_with()
دو مورد دیگر که به مدت طولانی به تأخیر افتاده اند ، این دو عملکرد اکنون در هسته اضافه شده اند. rfc
str_starts_with('haystack', 'hay'); // true str_ends_with('haystack', 'stack'); // true
توضیح: fdiv()
عملکرد جدید کاری مشابه عملکردها fmod()
و intdiv()
عملکردها را انجام می دهد ، که اجازه می دهد تقسیم 0 شود. به جای خطاهایی که می کنید INF
، -INF
یا NAN
بسته به مورد.
توضیخ: get_debug_type()
نوع متغیر را برمی گرداند. به نظر می رسد چیزی gettype()
می تواند انجام دهد؟ get_debug_type()
بازده مفیدتری را برای آرایه ها ، رشته ها ، کلاس ها و اشیاء ناشناس بر می گرداند.
به عنوان مثال ، فراخوانی gettype()
در کلاس \Foo\Bar
برمی گردد object
. استفاده از get_debug_type()
آن ، نام کلاس را برمی گرداند.
لیست کامل از تفاوت بین get_debug_type()
و gettype()
می توان در RFC پیدا شده است.
منابع با توجه به منابع خارجی متغیرهای ویژه در PHP هستند. یک مثال یک اتصال MySQL و دیگری دسته پرونده است.
به هر یک از این منابع یک شناسه اختصاص می یابد ، اگرچه پیش از این تنها راه شناخت این شناسه ، انتقال منابع به این موارد بود int
:
$resourceId = (int) $resource;
در php نسخه 8 get_resource_id()
توابع را اضافه می کند و این عمل را آشکارتر و بی خطر تر می کند:
$resourceId = get_resource_id($resource);
صفات می توانند روشهای انتزاعی را مشخص كنند كه باید توسط کلاسهایی كه از آنها استفاده می شود اجرا شود. هرچند یک نتیجه احتیاط وجود دارد: قبل از PHP 8 امضای این پیاده سازیها تأیید نشده بود. موارد زیر معتبر بود:
trait Test { abstract public function test(int $input): int;} class UsesTrait { use Test; public function test($input) { return $input; }}
در PHP 8 هنگام استفاده از یک صفت و اجرای روشهای انتزاعی ، اعتبار صحیح امضای روش را انجام می دهد. این بدان معنی است که باید به جای آن بنویسید:
class UsesTrait { use Test; public function test(int $input): int { return $input; }}
token_get_all()
این token_get_all()
تابع مجموعه ای از مقادیر را برمی گرداند. این RFC PhpToken
با یک PhpToken::getAll()
متد کلاس اضافه می کند . این پیاده سازی با اشیاء به جای مقادیر ساده کار می کند. حافظه کمتری مصرف می کند و خواندن آن راحت تر است.rfc
از RFC: "Uniform Variable Syntax RFC تعدادی از ناسازگاری ها در نحو متغیر PHP را برطرف کرده است.
بسیاری از مردم تن به تن در به اضافه کردن حاشیه نویسی نوع مناسب به تمام توابع داخلی. این یک مسئله طولانی مدت بود و سرانجام با کلیه تغییرات ایجاد شده در PHP در نسخه های قبلی قابل حل بود. این بدان معنی است که توابع و روشهای داخلی اطلاعات کاملی در بازتاب دارند.
ext-json
پیش از این امکان کامپایل PHP بدون پسوند JSON وجود داشت ، این دیگر امکان پذیر نیست. از آنجا که JSON بسیار مورد استفاده قرار می گیرد ، بهتر است توسعه دهندگان همیشه بتوانند به جای نیاز به اطمینان از وجود اولین پسوند ، به وجود آن اعتماد کنند.
همانطور که قبلاً ذکر شد: این یک بروزرسانی اساسی است و بنابراین تغییرات شکنی به وجود خواهد آمد. بهترین کار اینست که به لیست کامل تغییرات در سند UPGRADING نگاهی بیندازید .
بسیاری از این تغییرات شکستگی در نسخه های 7. نسخه قبلی کاهش یافته است ، بنابراین اگر شما در طول سال ها به روز بوده اید ، ارتقاء آن به PHP 8 خیلی سخت نیست.
توابع تعریف شده توسط کاربر در PHP قبلاً پرتاب می شوند TypeErrors
، اما توابع داخلی این کار را نمی کنند ، بلکه آنها هشدارهایی را منتشر می کردند و برگشتند null
. از PHP 8 رفتار توابع داخلی سازگار بوده است.
بسیاری از خطاهایی که قبلاً فقط باعث اخطارها یا اخطارها شده اند ، به خطاهای مناسب تبدیل شده اند. هشدارهای زیر تغییر کرد
Error
استثناء به جای اطلاع رسانیDivisionByZeroError
استثناء به جای هشدارError
استثناء به جای هشدارError
استثناء به جای هشدارError
استثناء به جای هشدارError
استثناء به جای هشدارError
استثنا به جای هشدارError
استثناء به جای هشدارError
استثناء به جای هشدارTraversables
قابل باز کردن هستند: TypeError
استثناء به جای هشدارTypeError
استثناء به جای هشدارTypeError
استثناء به جای هشدارTypeError
استثنا به جای هشدارTypeError
عدم تنظیم: استثناء به جای هشدارError
استثناء به جای هشدارTypeError
استثناء به جای هشدارممکن است این تغییر ممکن است خطاهایی را که دوباره قبل از PHP 8 پنهان شده اند ، نشان دهد display_errors=Off
! مطمئن شوید که سرورهای تولیدی خود را تنظیم کنید!
این در حال حاضر E_ALL
به جای همه چیز اما E_NOTICE
و E_DEPRECATED
. این بدان معناست که بسیاری از خطاها ممکن است ظاهر شوند که قبلاً در سکوت نادیده گرفته شده بودند ، اگرچه احتمالاً پیش از PHP 8 وجود داشته است.
از RFC: حالت خطای پیش فرض فعلی برای PDO خاموش است. این بدان معناست که وقتی یک خطای SQL رخ می دهد ، هیچ گونه خطایی یا هشدار ممکن است منتشر نشود و هیچ استثنائی از آن پرتاب نشود ، مگر اینکه توسعه دهنده مسئولیت رسیدگی به خطای صریح خود را انجام دهد.
این RFC خطای پیش فرض را PDO::ERRMODE_EXCEPTION
در PHP 8 تغییر می دهد .
اگرچه قبلاً در PHP 7.4 کاهش یافته است ، اکنون این تغییر اعمال می شود. اگر می خواهید چیزی مثل این را بنویسید:
echo "sum: " . $a + $b;
پی اچ پی قبلاً اینگونه تفسیر می کند:
echo ("sum: " . $a) + $b;
در PHP 8 آن را به گونه ای تبدیل می کند که به صورت زیر تفسیر شود:
echo "sum: " . ($a + $b);
قبل از PHP 8 ، امکان استفاده از عملگرهای حسابی یا بیت بیت بر روی آرایه ها ، منابع یا اشیاء وجود داشت. این دیگر امکان پذیر نیست و موارد زیر را پرتاب می کند TypeError
:
[] % [42];$object + 4;
سه امضای روش کلاس های بازتاب تغییر یافته اند:
ReflectionClass::newInstance($args); ReflectionFunction::invoke($args); ReflectionMethod::invoke($object, $args);
اکنون تبدیل شده اند:
ReflectionClass::newInstance(...$args); ReflectionFunction::invoke(...$args); ReflectionMethod::invoke($object, ...$args);
راهنمای ارتقا مشخص می کند که اگر این کلاس ها را گسترش دهید و هنوز هم می خواهید از PHP 7 و PHP 8 پشتیبانی کنید ، امضاهای زیر مجاز هستند:
ReflectionClass::newInstance($arg = null, ...$args); ReflectionFunction::invoke($arg = null, ...$args); ReflectionMethod::invoke($object, $arg = null, ...$args);
از RFC: خطاهای وراثت به دلیل امضاهای روش ناسازگار در حال حاضر یا بسته به علت خطا و سلسله مراتب ارث ، خطای مهلک یا هشداری را به وجود می آورند.
منابع:
https://7learn.com/programming/php/jit-compiler-in-php
https://stitcher.io/blog/new-in-php-8
https://react-etc.net/entry/php-8-0-0-release-date-and-jit-status
https://www.covetus.com/blog/php-80-the-upcoming-version-of-php-and-the-inclusion-of-jit
برنامه انتشار php 8 در سایت php.net
https://wiki.php.net/todo/php80