إصدار لغة البرمجة PHP 8.1

وبعد عام من التطوير، تم تقديم إصدار لغة البرمجة PHP 8.1. يتضمن الفرع الجديد سلسلة من الميزات الجديدة، بالإضافة إلى العديد من التغييرات التي تؤدي إلى كسر التوافق.

التحسينات الرئيسية في PHP 8.1:

  • تمت إضافة دعم للتعدادات، على سبيل المثال، يمكنك الآن استخدام التركيبات التالية: enum Status { case Pending; الحالة نشطة؛ الحالة مؤرشفة; } 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('بعد التعليق'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('بعد الاستئناف');
  • تم تحسين تنفيذ ذاكرة التخزين المؤقت لرمز الكائن (opcache)، مما يجعل من الممكن تخزين المعلومات حول وراثة الفئة مؤقتًا. جعل التحسين من الممكن زيادة أداء بعض التطبيقات بنسبة 5-8٪. تتضمن التحسينات الأخرى تحسين تشغيل JIT، وتنفيذ دعم JIT لبنية ARM64 (AArch64)، وتسريع تحليل الاسم، وتحسين مكتبات timelib وext/date، وزيادة أداء التسلسل وإلغاء التسلسل، وتحسين get_declared_classes()، وbode(). ، الدالة 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); // ["أ" => 1، "ب" => 2]
  • يُسمح باستخدام الكلمة الأساسية "جديدة" في أدوات التهيئة، كما هو الحال في تعريفات الوظائف كمعلمة افتراضية أو في سمات الوسيطات. class MyController { public function __construct( Private Logger $logger = new NullLogger(), ) {} }
  • من الممكن وضع علامة على خصائص الفئة للوصول للقراءة فقط (لا يمكن كتابة المعلومات الموجودة في هذه الخصائص إلا مرة واحدة، وبعد ذلك لن تكون متاحة للتغيير). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'أخرى'; > خطأ: لا يمكن تعديل خاصية القراءة فقط Post::$title
  • تم تنفيذ بناء جملة جديد للكائنات القابلة للاستدعاء - يمكن الآن تشكيل إغلاق عن طريق استدعاء دالة وتمرير القيمة "..." كوسيطة (أي myFunc(...) بدلاً من Closure::fromCallable('myFunc ')): function foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(أ: 1, ب: 2);
  • تمت إضافة دعم كامل لأنواع التقاطعات، مما يسمح لك بإنشاء أنواع جديدة من خلال الجمع بين الأنواع الموجودة. على عكس الأنواع الموحدة، التي تحدد مجموعات من نوعين أو أكثر، تتطلب أنواع التقاطع وجود ليس أيًا من الأنواع المدرجة، ولكن جميع الأنواع المحددة في المجموعة المراد ملؤها. function generatorSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • هناك نوع جديد "أبدًا" يمكن استخدامه لإبلاغ المحللين الثابتين بأن إحدى الوظائف ستنهي تنفيذ البرنامج، على سبيل المثال عن طريق طرح استثناء أو تنفيذ وظيفة الخروج. وظيفة dd (إدخال $ مختلط): أبدًا {خروج؛ }
  • تم اقتراح دالة جديدة array_is_list، والتي تسمح لك بتحديد أن المفاتيح في المصفوفة مرتبة حسب زيادة القيم الرقمية، بدءًا من 0: $list = ["a"، "b"، "c"]؛ array_is_list($list); // صحيح $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 { Final public const X = "foo"; } class Bar Extends Foo { public const X = "bar"; > خطأ فادح: لا يمكن لـ Bar::X تجاوز الثابت النهائي Foo::X }
  • تم اقتراح وظائف fsync وfdatasync لفرض حفظ التغييرات من ذاكرة التخزين المؤقت على القرص. $file = fopen("sample.txt", "w"); fwrite($file, "بعض المحتوى"); if (fsync($file)) { echo "تم حفظ الملف بنجاح على القرص."; } فكلوز($ملف);
  • تمت إضافة إمكانية استخدام البادئة "0o" و"0O" للأرقام الثمانية، بالإضافة إلى البادئة المستخدمة مسبقًا "0". 016 === 0o16; // صحيح 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_* إلى الكائنات.
  • لقد تم إهمال تمرير القيم الخالية كوسيطات إلى الوظائف الداخلية التي تم وضع علامة "غير قابلة للقيمة". في PHP 8.1، سيؤدي استخدام بنيات مثل str_contains("string"، null) إلى تحذير، وفي PHP 9 إلى خطأ.
  • تمت إضافة دعم لخوارزميات التجزئة MurmurHash3 وxxHash.

المصدر: opennet.ru

إضافة تعليق