Developers
Developers
خواندن ۲۵ دقیقه·۴ سال پیش

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

PHP 8
PHP 8

فقط چند (10) روز دیگر تا انتشار نسخه 8 PHP فاصله داریم.
امروز 2020 8 June
انتشار اولیه June 18 2020
جدول برنامه ریزی انتشار PHP 8 در سایت PHP.net

جدول برنامه ریزی انتشار PHP 8
جدول برنامه ریزی انتشار PHP 8


از آنجا که می دانیم PHP 7 بسیار جذاب است ، پیشرفت های چشمگیری را نسبت به PHP 5 دارد ، یا از نظر سرعت یا عملکرد صحبت می کنیم. همچنین ، آن را برای ما به ارمغان می آورد.

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

php 8
php 8

نسخه های قبلی 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 استفاده می کنند.

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خود به معنی یکی از این انواع است:

  • 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

این 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()

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

str_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-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

(این مطلب بروز رسانی خواهد شد و شما میتوانید با اعلام نظرات و اصلاحات خود در بخش کامنت ها به من در بهبود این مقاله کمک کنید)

برنامه نویسیphpطراحی سایتزبان برنامه نویسیphp 8
دانشمندان چیزی را که قبلا وجود داشته کشف میکنند اما برنامه نویسان چیزی که قبلا وجود نداشته را خلق میکنند.
شاید از این پست‌ها خوشتان بیاید