پس از یک سال توسعه، انتشار زبان برنامه نویسی PHP 8.1 ارائه شد. شاخه جدید شامل یک سری ویژگی های جدید و همچنین چندین تغییر است که سازگاری را از بین می برد.
پیشرفت های کلیدی در PHP 8.1:
- پشتیبانی اضافه شده برای شمارش ها، برای مثال، اکنون می توانید از ساختارهای زیر استفاده کنید: enum Status { case Pending; case Active; پرونده بایگانی شد. } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
- پشتیبانی از رشتههای سبک وزن به نام Fibers اضافه شده است که به شما امکان میدهد تا رشتههای اجرایی را در سطح پایین مدیریت کنید. قرار است پشتیبانی فیبر به فریمورک های Amphp و ReactPHP اضافه شود. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('after suspending'); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume('after resuming');
- اجرای حافظه پنهان کد شی (opcache) بهبود یافته است و امکان ذخیره اطلاعات در مورد وراثت کلاس را فراهم می کند. بهینه سازی امکان افزایش عملکرد برخی از برنامه ها را 5-8٪ فراهم کرد. بهینهسازیهای دیگر شامل بهینهسازی عملیات JIT، اجرای پشتیبانی JIT برای معماری ARM64 (AArch64)، تسریع وضوح نام، بهینهسازی کتابخانههای timelib و ext/date، افزایش عملکرد سریالسازی و سریالزدایی، بهینهسازی get_declared_classes()، explode() , تابع strtr() strnatcmp() dechex(). به طور کلی، 23.0٪ افزایش عملکرد برای Symfony Demo و 3.5٪ برای WordPress وجود دارد.
- عملگر بازگشایی در داخل آرایهها "...$var" که امکان جایگزینی آرایههای موجود را در هنگام تعریف یک آرایه جدید میدهد، برای پشتیبانی از کلیدهای رشتهای گسترش یافته است (قبلاً فقط شناسههای دیجیتال پشتیبانی میشدند). به عنوان مثال، اکنون می توانید در کد استفاده کنید: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump ($array); // ["a" => 1، "b" => 2]
- استفاده از کلمه کلیدی "جدید" در مقداردهی اولیه، از جمله در تعاریف تابع به عنوان یک پارامتر پیش فرض یا در ویژگی های آرگومان مجاز است. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
- علامت گذاری ویژگی های کلاس برای دسترسی فقط خواندنی امکان پذیر است (اطلاعات در چنین ویژگی هایی فقط یک بار می توانند نوشته شوند و پس از آن برای تغییر در دسترس نخواهند بود). class PostData { public function __construct( public only reading string $title, public only readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'سایر'; > خطا: امکان تغییر ویژگی فقط خواندنی پست::$title وجود ندارد
- یک نحو جدید برای اشیای قابل فراخوانی پیاده سازی شده است - اکنون می توان با فراخوانی یک تابع و ارسال مقدار "..." به عنوان آرگومان (یعنی myFunc(...) به جای Closure::fromCallable('myFunc) یک بسته ایجاد کرد. ')): تابع foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1، b: 2);
- پشتیبانی کامل از انواع تقاطع اضافه شده است که به شما امکان می دهد انواع جدیدی را با ترکیب انواع موجود ایجاد کنید. بر خلاف انواع اتحاد، که مجموعههایی از دو یا چند نوع را تعریف میکنند، انواع تقاطعها نیاز به حضور هیچکدام از انواع فهرستشده، بلکه همه انواع مشخصشده در مجموعه برای پر شدن دارند. function generateSlug(HasTitle&HasId $post) { return sttolower($post->getTitle()) . $post->getId(); }
- نوع جدیدی "هرگز" وجود دارد که می تواند برای اطلاع دادن به تحلیلگرهای استاتیک استفاده شود که یک تابع اجرای برنامه را خاتمه می دهد، برای مثال با پرتاب یک استثنا یا اجرای تابع خروج. تابع dd($input مختلط): هرگز { exit; }
- یک تابع جدید array_is_list پیشنهاد شده است که به شما امکان می دهد تعیین کنید که کلیدهای آرایه به ترتیب افزایش مقادیر عددی مرتب شده اند، از 0 شروع می شود: $list = [“a”, “b”, “c”]; array_is_list ($list); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list ($notAList); // false $alsoNotAList = ["a" => "a"، "b" => "b"، "c" => "c"]; array_is_list ($alsoNotAList); // نادرست
- اکنون می توانید از کلمه کلیدی "نهایی" برای جلوگیری از لغو ثابت های کلاس والد استفاده کنید. class Foo { const public final X = "foo"; } class Bar extends Foo { public const X = "bar"; > خطای مرگبار: نوار::X نمی تواند ثابت نهایی را لغو کند Foo::X }
- توابع fsync و fdatasync برای ذخیره تغییرات از حافظه پنهان دیسک پیشنهاد شدهاند. $file = fopen("sample.txt"، "w"); fwrite($file، "برخی محتوا"); if (fsync($file)) { echo "فایل با موفقیت در دیسک ثابت شد."; } fclose($file);
- امکان استفاده از پیشوندهای "0o" و "0O" برای اعداد اکتال، علاوه بر پیشوند قبلی "0" اضافه شده است. 016 === 0o16; // true 016 === 0O16; // درست است، واقعی
- پیشنهاد شده است به طور انتخابی استفاده از $GLOBALS محدود شود، که منجر به نقض سازگاری با عقب می شود، اما سرعت قابل توجهی عملیات با آرایه ها را ممکن می کند. به عنوان مثال، امکان غیرفعال کردن نوشتن به $GLOBALS و عبور دادن $GLOBALS توسط اشاره گر در نظر گرفته شده است. تجزیه و تحلیل 2000 بسته نشان داد که تنها 23 مورد از آنها تحت تأثیر این تغییر قرار می گیرند. به عنوان مثال، اگر پیشنهاد تایید شود، 8.1 دیگر از عباراتی مانند: $GLOBALS = [] پشتیبانی نمی کند. $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; تنظیم نشده ($GLOBALS); by_ref($GLOBALS);
- روش های داخلی اکنون باید نوع صحیح را برگردانند. در PHP 8.1، برگرداندن نوعی که با اعلان تابع مطابقت ندارد، یک هشدار ایجاد می کند، اما در PHP 9.0 هشدار با یک خطا جایگزین می شود.
- کار بر روی انتقال توابع از استفاده از منابع به دستکاری اشیا ادامه یافت. توابع finfo_* و imap_* به اشیا منتقل شده اند.
- ارسال مقادیر تهی بهعنوان آرگومانها به توابع داخلی با علامتگذاری nonnullable منسوخ شده است. در PHP 8.1، استفاده از ساختارهایی مانند str_contains ("string", null) منجر به هشدار و در PHP 9 به خطا می شود.
- پشتیبانی از الگوریتم های هش MurmurHash3 و xxHash اضافه شده است.
منبع: opennet.ru