تازه های PHP 8 چیست؟

PHP 8 اینجاست! در 26 نوامبر سال 2020 منتشر شد. می توانید آن را از اینجا بارگیری کنید. این یک نسخه اصلی جدید است ، به این معنی که برخی از تغییرات شکننده ، و همچنین بسیاری از ویژگی های جدید و بهبود عملکرد را ایجاد می کند.

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

علاوه برتغییرات شکننده ، PHP 8 همچنین مجموعه ای زیبا از ویژگی های جدید مانند کامپایلر JIT ، انواع یونیون ، ویژگی ها (attributes) و موارد دیگر را به همراه دارد.

# ویژگی های جدید

بیایید با تمام ویژگی های جدید شروع کنیم ، این یک لیست کامل است!


# Union types RFC

با توجه به نوع دینامیک طبیعت PHP ، موارد زیادی وجود دارد که انواع یونیون می تواند مفید باشد. Union types مجموعه ای از دو یا چند نوع است که می توان از هر یک از آنها استفاده کرد.

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

توجه داشته باشید که void هرگز نمی تواند بخشی از نوع union باشد ، زیرا نشان دهنده “عدم بازگشت مقدار” است. علاوه بر این ، یونیون های دارای قابلیت نول بودن را می توان با استفاده از | null نوشت ، یا با استفاده از موجود؟ نشانه گذاری:

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

public function bar(?Bar $bar): void;

# JIT RFC

کامپایلر JIT – دقیقاً به موقع – پیشرفت های چشمگیری را در عملکرد ارائه می دهد ، البته نه همیشه در متن درخواست های وب. من معیارهای خودم را در مورد برنامه های وب واقعی ساخته ام و به نظر می رسد JIT در چنین پروژه های PHP تفاوت چندانی ایجاد نمی کند ، در صورت وجود. .

اگر می خواهید در مورد آنچه JIT می تواند برای PHP انجام دهد بیشتر بدانید ، می توانید پست دیگری را که درباره آن نوشتم اینجا بخوانید.


# The nullsafe operator RFC

اگر با عملگر یکی شدن نول (null coalescing) آشنا باشید ، از قبل با کاستی های آن آشنا هستید: در فراخوانی های متد کار نمی کند. در عوض به بررسی های متوسط نیاز دارید ، یا به هلپرهای اختیاری ارائه شده توسط برخی از چارچوب ها اعتماد کنید:

$startDate = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

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

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

می توانید همه چیز درباره عملگر nullsafe را اینجا بخوانید.


# Named arguments RFC

آرگومان های نامگذاری شده به شما امکان می دهند با تعیین نام مقدار ، مقادیری را به یک تابع منتقل کنید تا مجبور نشوید ترتیب آنها را در نظر بگیرید و همچنین می توانید از پارامترهای اختیاری صرف نظر کنید!

function foo(string $a, string $b, ?string $c = null, ?string $d = null)
{ }

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

می توانید در این پست به طور عمیق درباره آنها بخوانید.


# Attributes RFC

صفت ها (Attributes)، که به زبان های دیگر به عنوان حاشیه نویسی (annotations) شناخته می شوند ، راهی را برای افزودن داده های متا به کلاس ها ، بدون تجزیه بلوکهای doc، ارائه می دهد.

در مورد یک نگاه سریع ، در اینجا مثالی از ویژگی ها از RFC آورده شده است:

use AppAttributesExampleAttribute;

class Foo
{

public const FOO = 'foo';

public $x;

public function foo(ExampleAttribute $bar) { }
}

class ExampleAttribute
{
public $value;

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

توجه داشته باشید که این صفت پایه قبلاً در RFC اصلی PhpAttribute نامیده می شد ، اما پس از آن با RFC دیگری تغییر یافت. اگر می خواهید در نحوه کارکرد صفت ها و نحوه ایجاد صفت های خاص خود غوطه ور شوید. می توانید صفت ها را به طور عمیق در این وبلاگ بخوانید.

# Match expression RFC

می توانید آن را برادر بزرگ عبارت سوییچ بنامید: match می تواند مقادیری را برگرداند ، به عبارات break نیاز ندارد ، می تواند شرط ها را با هم ترکیب کند ، از مقایسه نوع دقیق استفاده کند و هیچ نوع اجباری را انجام ندهد.

به نظر می رسد به این شکل است:

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

در اینجا می توانید جزئیات match expression را بخوانید.


# Constructor property promotion 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,
) {}
}

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


# New static return type RFC

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

class Foo
{
public function test(): static
{
return new static();
}
}

# New mixed type RFC

برخی ممکن است آن را یک شر ضروری بنامند: نوع مخلوط mixed باعث می شود بسیاری احساسات متفاوتی داشته باشند. یک استدلال بسیار خوب وجود دارد که بتواند آن را ارائه دهد: نوع گمشده می تواند به معنای بسیاری از موارد در PHP باشد:

  • یک تابع هیچ چیزبرنمیگرداند یا null را برمیگرداند
  • ما انتظار یکی از چند نوع را داریم
  • ما انتظار داریم نوعی باشد که در PHP نتوان آن را اشاره کرد

به دلایل بالا ، چیز خوبی است که نوع mixed اضافه می شود. mixed به خودی خود یکی از این انواع است:

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

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

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

function bar(): ?mixed {}

# Throw expression RFC

این RFC از statement بودن به یک expression تبدیل می شود که امکان پرتاب استثنا در بسیاری از مکان های جدید را فراهم می کند:

$triggerError = fn () => throw new MyError();

$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');

# Inheritance with private methods RFC

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

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

هشدار: متدهای خصوصی نمی توانند نهایی باشند زیرا هرگز توسط کلاسهای دیگر مغلوب نمی شوند


# Weak maps RFC

با استفاده از weakrefs RFC که در PHP 7.4 اضافه شده است ، یک پیاده سازی WeakMap در PHP 8 اضافه شده است. WeakMap ارجاعاتی را به اشیا نگه می دارد ، که مانع جمع آوری زباله ها (garbage) نمی شود.

از ORM ها مثال بزنید ، آنها اغلب کَش هایی را اجرا می کنند که برای کلاسهای موجودیت (entity class) ارجاعات را نگه میدارد تا پرفورمنس روابط بین موجودیت ها را بهبود بخشد. این اشیا موجودیت نمی توانند زباله جمع کنند ، به شرطی که این کَش به آنها ارجاع داشته باشد ، حتی اگر کَش تنها چیزی باشد که به آنها ارجاع می کند.

اگر این لایه کَش از ارجاعات و نقشه های ضعیف استفاده کند ، PHP این اشیا را جمع می کند در حالی که دیگر هیچ چیز دیگری به آنها ارجاع نمی دهد. به خصوص در مورد ORM ها ، که اگر نه هزاران می تواند صدها موجودیت را در یک درخواست مدیریت کند. نقشه های ضعیف می توانند روشی بهتر و مناسب تر برای برخورد با این اشیا را ارائه دهند.

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

class Foo
{
private WeakMap $cache;

public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}

# Allowing ::class on objects RFC

یک ویژگی کوچک ، در عین حال مفید و جدید: اکنون می توان به جای استفاده از get_class() بر روی اشیا ، از ::class استفاده کرد که به همان روش get_class() عمل می کند.

$foo = new Foo();

var_dump($foo::class);

# Non-capturing catches RFC

تا قبل از PHP 8 هر زمان که میخواستید یک استثنا را بگیرید ، مجبور بودید آن را در یک متغیر ذخیره کنید ، بدون توجه به اینکه از آن متغیر استفاده کرده اید یا نه. با گرفتن های غیر ضبط (non-capturing catches) ، می توانید متغیر را از قلم بی اندازید ، بنابراین به جای این کد:

try {

} catch (MySpecialException $exception) {
Log::error("Something went wrong");
}

میتوانید کد زیر را بنویسید:

try {

} catch (MySpecialException) {
Log::error("Something went wrong");
}

توجه داشته باشید که لازم است همیشه نوع آن مشخص شود ، مجاز به گرفتن خالی (empty catch) نیستید. اگر می خواهید همه موارد استثنا و خطا را بگیرید ، می توانید از Throwable به عنوان نوع گیرنده (catching type) استفاده کنید.


# Trailing comma in parameter lists RFC

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

public function(
string $parameterA,
int $parameterB,
Foo $objectfoo,
) {

}

بعنوان یک راهنما: ویرگولهای عقب نیز در لیست استفاده از بستارها (the use list of closures) پشتیبانی می شوند ، این از قلم افتاده بود بود و اکنون از طریق RFC جداگانه اضافه می شود.


# Create DateTime objects from interface

از قبل می توانید یک شی DateTimeImmutable یک شی DateTime ایجاد کنید ، با استفاده از:

DateTime::createFromImmutable($immutableDateTime)

اما راه دیگر روی حیله و ترفند بود. با افزودن DateTime::createFromInterface() و DatetimeImmutable::createFromInterface() اکنون یک روش کلی برای تبدیل اشیای DateTime و DateTimeImmutable به یکدیگر وجود دارد.

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);

# New Stringable interface RFC

رابط Stringable می تواند برای هینت تایپ هر چیزی که __toString() را پیاده سازی می کند ، استفاده شود. هر زمان که یک کلاس __toString() را اجرا می کند ، به طور خودکار رابط پشت صحنه را پیاده سازی می کند و نیازی به اجرای دستی آن نیست.

class Foo
{
public function __toString(): string
{
return 'foo';
}
}

function bar(string|Stringable $stringable) { }

bar(new Foo());
bar('abc');

# New str_contains() function RFC

ممکن است برخی بگویند که مدت زمان زیادی گذشته است ، اما ما در نهایت نیازی به اعتماد به strpos() نداریم تا بدانیم که آیا یک رشته شامل رشته دیگری هست یا نه.

به جای انجام این کار:

if (strpos('string with lots of words', 'words') !== false) { }

این کار را بکنید:

if (str_contains('string with lots of words', 'words')) { }

# New str_starts_with() and str_ends_with() functions RFC

مدت زمان دو مورد دیگر سر رسیده ، این دو تابع اکنون در هسته اضافه می شوند.

str_starts_with('haystack', 'hay');
str_ends_with('haystack', 'stack');

# New fdiv() function PR

 

تابع جدید fdiv() چیزی مشابه توابع fmod() و intdiv() را انجام می دهد که اجازه تقسیم بر 0 را می دهد. به جای خطا ، بسته به مورد INF ، -INF یا NAN را برمیگرداند.


# New get_debug_type() function RFC

get_debug_type() نوع متغیر را برمی گرداند. به نظر می رسد gettype() کاری انجام دهد؟ get_debug_type() خروجی مفیدتری برای آرایه ها ، رشته ها ، کلاس های ناشناس و اشیاء باز می گرداند.

به عنوان مثال ، فراخوانی gettype() در کلاس FooBar ، شی را برمی گرداند. استفاده از get_debug_type() نام کلاس را برمی گرداند.

لیست کاملی از تفاوتهای get_debug_type() و gettype() را می توانید در RFC بیابید


# New get_resource_id() function PR

Resourceها متغیرهای خاصی در PHP هستند که به منابع خارجی اشاره دارند. یک مثال اتصال MySQL و نمونه دیگر دسته فایل است.

به هر یک از این منابع یک شناسه اختصاص داده می شود ، اگرچه قبلاً تنها راه برای شناختن این شناسه کست کردن منبع به int بود:

$resourceId = (int) $resource;

PHP 8 توابع get_resource_id() را اضافه می کند و این عمل را واضح تر و ایمن تر می کند:

$resourceId = get_resource_id($resource);


# روشهای انتزاعی در بهبود ترایت ها (traits) 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() RFC

تابع token_get_all() مجموعه ای از مقادیر را برمی گرداند. این RFC یک کلاس PhpToken را با روش PhpToken::tokenize اضافه می کند. این پیاده سازی به جای مقادیر ساده با اشیاء کار می کند. حافظه کمتری مصرف می کند و خواندن آن راحت تر است.


# اصلاح و پیچیدن سینتاکس متغیر RFC

ازRFC: سینتاکس یکنواخت متغیرRFC ، تعدادی از ناهماهنگی های سینتاکس متغیر PHP را برطرف کرد. این RFC قصد دارد تعداد کمی از مواردی را که نادیده گرفته شده است ، آدرس دهی کند.”


# برای توابع داخلی حاشیه نویسی کنید EXTERNALS

بسیاری از مردم برای افزودن تفسیر مناسب به همه توابع داخلی وارد عمل شدند. این یک مسئله قدیمی بود و در نهایت با همه تغییرات ایجاد شده در PHP در نسخه های قبلی قابل حل بود. این بدان معناست که توابع و متدهای داخلی دارای اطلاعات کامل در بازتاب خواهند بود.


# ext-json همیشه در درترس خواهد بود RFC

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

# شکستن تغییرات

همانطور که قبلاً ذکر شد: این یک به روز رسانی بزرگ است و بنابراین تغییرات فاحشی رخ خواهد داد. بهترین کار این است که به لیست کامل تغییرات در سند UPGRADING نگاهی بیندازید.

با توجه به اینکه بسیاری از این تغییرات فاحش در نسخه های قبلی*.7 منسوخ شده اند ، بنابراین اگر در طول سالها به روز بوده اید ، ارتقاء به PHP 8 نباید چندان سخت باشد.

 

# Consistent type errors RFC

توابع تعریف شده توسط کاربر در PHP قبلاً خطای TypeError را پرتاب می کردند ، اما توابع داخلی این کار را انجام نمیدادند ، بلکه هشدارها را منتشر میکردند و null را بازمیگرداندند. از PHP 8 رفتار توابع داخلی ثابت شده است.


# طبقه بندی مجدد موتور هشدار دادن RFC

بسیاری از خطاها که قبلاً فقط باعث warning یا notice می شدند ، به خطاهای مناسب تبدیل شده اند. هشدارهای زیر تغییر کرد.

  • Undefined variable: Error exception instead of notice
  • Undefined array index: warning instead of notice
  • Division by zero: DivisionByZeroError exception instead of warning
  • Attempt to increment/decrement property '%s' of non-object: Error exception instead of warning
  • Attempt to modify property '%s' of non-object: Error exception instead of warning
  • Attempt to assign property '%s' of non-object: Error exception instead of warning
  • Creating default object from empty value: Error exception instead of warning
  • Trying to get property '%s' of non-object: warning instead of notice
  • Undefined property: %s::$%s: warning instead of notice
  • Cannot add element to the array as the next element is already occupied: Error exception instead of warning
  • Cannot unset offset in a non-array variable: Error exception instead of warning
  • Cannot use a scalar value as an array: Error exception instead of warning
  • Only arrays and Traversables can be unpacked: TypeError exception instead of warning
  • Invalid argument supplied for foreach(): TypeError exception instead of warning
  • Illegal offset type: TypeError exception instead of warning
  • Illegal offset type in isset or empty: TypeError exception instead of warning
  • Illegal offset type in unset: TypeError exception instead of warning
  • Array to string conversion: warning instead of notice
  • Resource ID#%d used as offset, casting to integer (%d): warning instead of notice
  • String offset cast occurred: warning instead of notice
  • Uninitialized string offset: %d: warning instead of notice
  • Cannot assign an empty string to a string offset: Error exception instead of warning
  • Supplied resource is not a valid stream resource: TypeError exception instead of warning

# اپراتور @ دیگر خطاهای مهلک (fatal errors) را خاموش نمی کند

این احتمال وجود دارد که این تغییر خطاهایی را نشان دهد که قبل از PHP 8 مخفی شده اند. مطمئن شوید که display_errors = Off را در سرورهای تولیدی خود تنظیم کنید!


# سطح پیش فرض گزارش خطا

اکنون E_ALL به جای همه چیز به غیر از E_NOTICE و E_DEPRECATED است. این بدان معناست که ممکن است بسیاری از خطاها ظاهر شوند که قبلاً بی سر و صدا نادیده گرفته شده بودند ، اگرچه احتمالاً قبل از PHP 8 وجود داشته اند.


# Default PDO error mode RFC

از RFC: حالت خطای پیش فرض قبل از نسخه 8 برای PDO خاموش بود. این بدان معناست که وقتی خطای SQL رخ می داد ، هیچ گونه خطا یا هشداری صادر نمی شد و هیچ استثنائی نیز پرتاب نمی شد مگر اینکه توسعه دهنده ، مدیریت خطای صریح خود را پیاده سازی میکرد.

این RFC تغییر خطای پیش فرض را در PHP 8 به PDO::ERRMODE_EXCEPTION تغییر می دهد.

 


# تقدم الحاق RFC

در حالی که قبلاً در PHP 7.4 منسوخ شده بود ، اکنون این تغییر اعمال می شود. اگر چیزی شبیه این مینوشتید:

echo "sum: " . $a + $b;

پی اچ پی قبلاً اینگونه تفسیر می کرد:

echo ("sum: " . $a) + $b;

PHP 8 باعث می شود که اینگونه تفسیر شود:

echo "sum: " . ($a + $b);


# نوع اکید برای حسابی و بیتی RFC

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

[] % [42];
$object + 4;


# نام فضاهای-نام یک توکن واحد هستند RFC

PHP برای تفسیر هر قسمت از یک فضای-نام (جدا شده توسط یک بک اسلش) به عنوان دنباله ای ازتوکنها استفاده می کرد. این RFC این رفتار را تغییر داد ، به این معنی که نام های رزرو شده اکنون می توانند در فضاهای نام استفاده شوند.


# رشته های عددی پاکسازی شده RFC

سیستم نوع PHP سعی می کند بسیاری از کارهای هوشمند را هنگام مواجه شدن با اعداد در رشته انجام دهد. این RFC این رفتار را سازگارتر و واضح تر می کند.


# رشته پاکسازی شده برای مقایسه اعداد RFC

این RFC موردی بسیار عجیب و غریب را در PHP برطرف می کند که در آن 0 == “foo” مقدار true را نشان می دهد. موارد مشابه دیگری نیز وجود دارد و این RFC آنها را برطرف می کند.


# بازتاب تغییر می کند

چند متد بازتابی (reflection methods) منسوخ شده است:

  • ReflectionFunction::isDisabled()
  • ReflectionParameter::getClass()
  • ReflectionParameter::isCallable()

اکنون باید از ReflectionType برای کسب اطلاعات در مورد نوع پارامتر استفاده کنید:

$reflectionParameter->getType()->allowsNull();

اگر نوع یک نوع مفرد است ، ReflectionParameter::getType() یک نمونه از ReflectionNamedType را برمی گرداند ، تا بتوانید نامش را دریافت کنید و اینکه آیا درون ساخت (built-in) است یا خیر:

$reflectionParameter->getType()->getName();
$reflectionParameter->getType()->isBuiltin();

اگر این نوع یک نوع union باشد ، یک نمونه از ReflectionUnionType دریافت خواهید کرد ، که می تواند آرایه ای از ReflectionNamedType به شما بدهد:

$reflectionParameter->getType()->getTypes();

بررسی اینکه آیا یک نوع union است یا خیر را می توان با instanceof انجام داد:

if ($reflectionParameter->getType() instanceof ReflectionNamedType) {

}

if ($reflectionParameter->getType() instanceof ReflectionUnionType) {

}

در مرحله بعد ، سه متد امضای کلاسهای بازتاب تغییر کرده است:

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

قبل از PHP 8 ، الگوریتم های مرتب سازی ناپایدار بودند. این بدان معناست که ترتیب عناصر مساوی تضمین نشده بود. PHP 8 رفتار همه توابع مرتب سازی را به مرتب سازی پایدار تغییر می دهد.


# خطای مهلک برای امضاهای متد ناسازگار (incompatible method) RFC

از RFC: خطاهای وراثت به دلیل امضاهای متد ناسازگار اکنون یا بسته به علت خطا و سلسله مراتب وراثت ، خطای مهلک (فاتال) یا هشدار(وارنینگ) را ایجاد می کنند.


# منسوخها و تغییرات دیگر

در طول توسعه ورژنهایPHP 7 ، چندین مورد منسوخ تعیین شد که اکنون در PHP 8 نهایی شده و قابل استفاده نیست.


 

از سایت منبع این نوشته دیدار فرمایید ( اینجا کلیک کنید)

What’s new in PHP 8

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

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