نسخه 8 زبان برنامه نویسی PHP

PHP 8فقط چند (10) روز دیگر تا انتشار نسخه 8 PHP فاصله داریم.امروز 2020 8 June انتشار اولیه June 18 2020جدول برنامه ریزی انتشار PHP 8 در سایت PHP.netجدول برنامه ریزی انتشار PHP 8از آنجا که می دانیم PHP 7 بسیار جذاب است ، پیشرفت های چشمگیری را نسبت به PHP 5 دارد ، یا از نظر سرعت یا عملکرد صحبت می کنیم. همچنین ، آن را برای ما به ارمغان می آورد.با این حال ، این اشتباه است که بگوییم یک زبان کامل و بدون نقص است بنابراین ، وقتی صحبت از PHP 8 می شود ، انتظارات کاربران بسیار زیاد است. خوب ، جایی که همه دوست دارند PHP 8 را ببینند ، دارای ویژگی های واقعی تر است. به این دلیل است که این ویژگی به شما کمک می کند تا از زبان های دیگر در یک پروژه PHP استفاده نکنید و فقط به خاطر زمان واقعی است.php 8نسخه های قبلی PHP تا الانتاکنون چندین نسخه از PHP تکامل یافته است. بنابراین ، اجازه دهید نسخه های PHP را که از قبل در بازار موجود است در اینجا بررسی کنیم.1.0 هشتم ژوئن 19952.0 اول نوامبر 19973.0 ششم ژوئن 1998 تا 20 اکتبر 20004.0 در 22 مه 2000 تا 23 ژوئن 20014.1 دهم دسامبر 2001 تا 12 مارس 20024.2 در 22 آوریل 2002 تا ششم سپتامبر 20024.3 در 27 دسامبر 2002 تا 31 مارس 20054.4 یازدهم ژوئیه 2005 7th اوت 20085.0 سیزدهم ژوئیه 2004 تا 5 سپتامبر 20055.1 در 24 نوامبر 2005 تا 24 آگوست 20065.2 در 2 نوامبر 2006 تا ششم ژانویه 20115.3 در 30 ژوئن 2009 تا 14 آگوست 20145.4 اول مارس 2012 تا 3 سپتامبر 20155.5 در 20 ژوئن 2013 تا 21 ژوئیه 20165.6 در 28 آگوست 2014 تا 31 دسامبر 20187.0 در 3 دسامبر 2015 تا 3 دسامبر 20187.1 اول دسامبر 2016 تا اول دسامبر 20197.2 در 30 نوامبر 2017 تا 30 نوامبر 20207.3 در 6 دسامبر 2018 تا دسامبر 2021حالت فقط در زمان (JIT) در 8 PHPدرست در زمان تلفیقی (Just in time) راهی برای بهینه سازی کد در حال اجرا است. این یک روش محبوب است که توسط ماشین مجازی جاوا (JVM) و همچنین محبوب V8 JavaScript VM از Google استفاده می شود. در حالی که هر دو از JIT استفاده می کنند. https://www.aparat.com/video/video/embed/videohash/ZP0dO/vt/frame در ابتدا توسعه 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توضیح: 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توضیح: 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 8انواع اتحادیه rfcبا توجه به نوع پویا تایپ شده در 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ویژگی ها ، که معمولاً با زبان های دیگر به عنوان حاشیه نویسی شناخته می شوند ، راهی برای افزودن داده های متا به کلاس ها ، بدون نیاز به تجزیه جلد سند ، ارائه می دهد.همانطور که برای یک نگاه سریع ، مثالی از آنچه که از ویژگی ها به نظر می رسد ، از 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این 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 باشد:یک عملکرد هیچ چیز یا تهی را برنمی گرداندما در حال انتظار یکی از انواع مختلف هستیمما در حال انتظار نوعی هستیم که نمی توان در PHP به آن اشاره کردبه دلایل فوق ، چیز خوبی است که mixedنوع آن اضافه می شود. mixedخود به معنی یکی از این انواع است:arrayboolcallableintfloatnullobjectresourcestringتوجه داشته باشید که mixedمی تواند به عنوان یک پارامتر یا نوع خاصیت استفاده شود ، نه فقط به عنوان یک نوع بازگشت.همچنین توجه داشته باشید که از mixedقبل شامل شده null، مجاز نیست آن را باطل کند. موارد زیر خطایی را ایجاد می کند:// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type. function bar(): ?mixed {}بیان را پرتاب کنید rfcاین RFC throw از بیانیه بودن به یک عبارت تغییر می کند ، و این باعث می شود که در بسیاری از مکان های جدید استثناء ایجاد شود: $triggerError = fn () => throw new MyError(); $foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');نقشه های ضعیف rfcبا استفاده از 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);صید بدون گرفتن rfcهر زمان که قبل از PHP 8 می خواستید یک استثنا را بدست آورید ، مجبور بودید که بدون توجه به اینکه از آن متغیر استفاده کرده اید ، آن را در یک متغیر ذخیره کنید. با استفاده از صیدهای بدون گرفتن ، می توانید متغیر را حذف کنید ، بنابراین به جای این موارد: try { // Something goes wrong} catch (MySpecialException $exception) {Log::error(&quotSomething went wrong&quot);}اکنون می توانید این کار را انجام دهید: try { // Something goes wrong} catch (MySpecialException) { Log::error(&quotSomething went wrong&quot);}توجه داشته باشید که لازم است همیشه نوع آن را مشخص کنید ، شما اجازه ندارید که خالی کنید catch. اگر می خواهید همه موارد استثنا و خطا را بدست آورید ، می توانید Throwableبه عنوان نوع گیرنده از آن استفاده کنید .ردیابی کاما در لیست پارامترها rfcدر هنگام فراخوانی یک تابع از قبل امکان پذیر است ، هنوز پشتیبانی لیست کاما در لیست پارامترها وجود ندارد. اکنون در PHP 8 مجاز است ، به این معنی که می توانید موارد زیر را انجام دهید: public function( string $parameterA, int $parameterB, Foo $objectfoo,) { // …}اشیاء را از رابط ایجاد کنید DateTimeدر حال حاضر می توانید با DateTimeاستفاده از یک DateTimeImmutableشیء یک شی ایجاد کنید DateTime::createFromImmutable($immutableDateTime)، اما روش دیگر مشکل بود. با اضافه کردن DateTime::createFromInterface()و DatetimeImmutable::createFromInterface()اکنون یک روش کلی برای تبدیل DateTimeو DateTimeImmutableاشیاء به یکدیگر وجود دارد.DateTime::createFromInterface(DateTimeInterface $other); DateTimeImmutable::createFromInterface(DateTimeInterface $other);رابط کاربری جدید Stringable rfcتوضیح: 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()دو مورد دیگر که به مدت طولانی به تأخیر افتاده اند ، این دو عملکرد اکنون در هسته اضافه شده اند. rfcstr_starts_with('haystack', 'hay'); // true str_ends_with('haystack', 'stack'); // trueعملکرد جدید روابط عمومی fdiv()توضیح: fdiv()عملکرد جدید کاری مشابه عملکردها fmod()و intdiv()عملکردها را انجام می دهد ، که اجازه می دهد تقسیم 0 شود. به جای خطاهایی که می کنید INF، -INFیا NANبسته به مورد.عملکرد جدید get_debug_type() روابط عمومیتوضیخ: get_debug_type()نوع متغیر را برمی گرداند. به نظر می رسد چیزی gettype()می تواند انجام دهد؟ get_debug_type()بازده مفیدتری را برای آرایه ها ، رشته ها ، کلاس ها و اشیاء ناشناس بر می گرداند.به عنوان مثال ، فراخوانی gettype()در کلاس \Foo\Barبرمی گردد object. استفاده از get_debug_type()آن ، نام کلاس را برمی گرداند.لیست کامل از تفاوت بین get_debug_type()و gettype()می توان در RFC پیدا شده است.عملکرد جدید get_resource_id() روابط عمومیمنابع با توجه به منابع خارجی متغیرهای ویژه در PHP هستند. یک مثال یک اتصال MySQL و دیگری دسته پرونده است.به هر یک از این منابع یک شناسه اختصاص می یابد ، اگرچه پیش از این تنها راه شناخت این شناسه ، انتقال منابع به این موارد بود int:$resourceId = (int) $resource;در php نسخه 8 get_resource_id()توابع را اضافه می کند و این عمل را آشکارتر و بی خطر تر می کند:$resourceId = get_resource_id($resource);روش های انتزاعی در بهبود صفات rfcصفات می توانند روشهای انتزاعی را مشخص كنند كه باید توسط کلاسهایی كه از آنها استفاده می شود اجرا شود. هرچند یک نتیجه احتیاط وجود دارد: قبل از 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از RFC: "Uniform Variable Syntax RFC تعدادی از ناسازگاری ها در نحو متغیر PHP را برطرف کرده است.یادداشتهای مربوط به عملکردهای داخلی را تایپ کنید خارجیبسیاری از مردم تن به تن در به اضافه کردن حاشیه نویسی نوع مناسب به تمام توابع داخلی. این یک مسئله طولانی مدت بود و سرانجام با کلیه تغییرات ایجاد شده در PHP در نسخه های قبلی قابل حل بود. این بدان معنی است که توابع و روشهای داخلی اطلاعات کاملی در بازتاب دارند.همیشه در دسترس ext-jsonپیش از این امکان کامپایل PHP بدون پسوند JSON وجود داشت ، این دیگر امکان پذیر نیست. از آنجا که JSON بسیار مورد استفاده قرار می گیرد ، بهتر است توسعه دهندگان همیشه بتوانند به جای نیاز به اطمینان از وجود اولین پسوند ، به وجود آن اعتماد کنند.تغییرات ایجاد می شودهمانطور که قبلاً ذکر شد: این یک بروزرسانی اساسی است و بنابراین تغییرات شکنی به وجود خواهد آمد. بهترین کار اینست که به لیست کامل تغییرات در سند UPGRADING نگاهی بیندازید .بسیاری از این تغییرات شکستگی در نسخه های 7. نسخه قبلی کاهش یافته است ، بنابراین اگر شما در طول سال ها به روز بوده اید ، ارتقاء آن به PHP 8 خیلی سخت نیست.خطاهای نوع سازگار rfcتوابع تعریف شده توسط کاربر در PHP قبلاً پرتاب می شوند TypeErrors، اما توابع داخلی این کار را نمی کنند ، بلکه آنها هشدارهایی را منتشر می کردند و برگشتند null. از PHP 8 رفتار توابع داخلی سازگار بوده است.هشدارهای طبقه بندی مجدد موتور rfcبسیاری از خطاهایی که قبلاً فقط باعث اخطارها یا اخطارها شده اند ، به خطاهای مناسب تبدیل شده اند. هشدارهای زیر تغییر کردمتغیر تعریف نشده: Errorاستثناء به جای اطلاع رسانیفهرست آرایه نامشخص: هشدار به جای اخطارتقسیم بر صفر: DivisionByZeroErrorاستثناء به جای هشدارتلاش برای افزایش / کاهش املاک "٪ s" از غیر شیء: Errorاستثناء به جای هشدارتلاش برای تغییر "٪ s" ویژگی غیرمجاز: Errorاستثناء به جای هشدارتلاش برای اختصاص "٪ s" ویژگی غیرمجاز: Errorاستثناء به جای هشدارایجاد شیء پیش فرض از مقدار خالی: Errorاستثناء به جای هشدارتلاش برای به دست آوردن ویژگی "٪ s" از غیر شیء: اخطار به جای اخطارویژگی نامشخص:٪ s :: $٪ s: هشدار به جای اعلامنمی توان عنصر را به آرایه اضافه کرد زیرا عنصر بعدی در حال حاضر اشغال شده است: Errorاستثنا به جای هشدارنمی توان در متغیر غیر آرایه جبران کرد: Errorاستثناء به جای هشدارنمی توان از یک مقیاس مقیاس به عنوان یک آرایه استفاده کرد: Errorاستثناء به جای هشدارفقط آرایه ها Traversablesقابل باز کردن هستند: TypeErrorاستثناء به جای هشداراستدلال نامعتبر ارائه شده برای foreach (): TypeErrorاستثناء به جای هشدارنوع جبران غیرقانونی: TypeErrorاستثناء به جای هشدارنوع جبران غیرقانونی در صادر یا خالی: TypeErrorاستثنا به جای هشدارنوع جبران غیرقانونی در TypeErrorعدم تنظیم: استثناء به جای هشدارآرایه به تبدیل رشته: هشدار به جای توجهشناسه منبع #٪ d به عنوان جبران ، ریخته گری به عدد صحیح (٪ d): هشدار به جای توجهبازیگران رشته افست رخ داده است: هشدار به جای اخطارجبران رشته غیرمجاز:٪ d: هشدار به جای اخطارنمی توان رشته ای خالی را به یک جبران رشته داد: Errorاستثناء به جای هشدارمنبع تأمین شده منبع جریان معتبری نیست: TypeErrorاستثناء به جای هشداراپراتور @ دیگر خطاهای مهلک را خاموش نمی کندممکن است این تغییر ممکن است خطاهایی را که دوباره قبل از PHP 8 پنهان شده اند ، نشان دهد display_errors=Off! مطمئن شوید که سرورهای تولیدی خود را تنظیم کنید!سطح گزارش خطای پیش فرضاین در حال حاضر E_ALLبه جای همه چیز اما E_NOTICEو E_DEPRECATED. این بدان معناست که بسیاری از خطاها ممکن است ظاهر شوند که قبلاً در سکوت نادیده گرفته شده بودند ، اگرچه احتمالاً پیش از PHP 8 وجود داشته است.حالت خطای پیش فرض PDO rfcاز RFC: حالت خطای پیش فرض فعلی برای PDO خاموش است. این بدان معناست که وقتی یک خطای SQL رخ می دهد ، هیچ گونه خطایی یا هشدار ممکن است منتشر نشود و هیچ استثنائی از آن پرتاب نشود ، مگر اینکه توسعه دهنده مسئولیت رسیدگی به خطای صریح خود را انجام دهد.این RFC خطای پیش فرض را PDO::ERRMODE_EXCEPTIONدر PHP 8 تغییر می دهد .تقدم جمع بندی rfcاگرچه قبلاً در PHP 7.4 کاهش یافته است ، اکنون این تغییر اعمال می شود. اگر می خواهید چیزی مثل این را بنویسید:echo &quotsum: &quot . $a + $b;پی اچ پی قبلاً اینگونه تفسیر می کند:echo (&quotsum: &quot . $a) + $b;در PHP 8 آن را به گونه ای تبدیل می کند که به صورت زیر تفسیر شود:echo &quotsum: &quot . ($a + $b);بررسی نوع دقیق تر برای اپراتورهای حساب و بیت بیت rfcقبل از 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از RFC: خطاهای وراثت به دلیل امضاهای روش ناسازگار در حال حاضر یا بسته به علت خطا و سلسله مراتب ارث ، خطای مهلک یا هشداری را به وجود می آورند.منابع:https://7learn.com/programming/php/jit-compiler-in-phphttps://stitcher.io/blog/new-in-php-8https://react-etc.net/entry/php-8-0-0-release-date-and-jit-statushttps://www.covetus.com/blog/php-80-the-upcoming-version-of-php-and-the-inclusion-of-jitبرنامه انتشار php 8 در سایت php.nethttps://wiki.php.net/todo/php80(این مطلب بروز رسانی خواهد شد و شما میتوانید با اعلام نظرات و اصلاحات خود در بخش کامنت ها به من در بهبود این مقاله کمک کنید)