شارك المقال

الجديد في PHP 8.1: الميزات والتغييرات والتحسينات والمزيد

A VPN is an essential component of IT security, whether you’re just starting a business or are already up and running. Most business interactions and transactions happen online and VPN

تم إطلاق PHP 8.0 وسط ضجة كبيرة منذ وقت ليس ببعيد. لقد جلب العديد من الميزات الجديدة وتحسينات الأداء والتغييرات – وكان أكثرها إثارة هو مترجم JIT الجديد.

يسير عالم التكنولوجيا دائمًا إلى الأمام ، وينطبق الشيء نفسه على PHP.

يكاد PHP 8.1 هنا ، وهو مليء بالعديد من الميزات المثيرة. من المقرر إطلاقه في وقت لاحق من هذا العام في 25 نوفمبر 2021.

في هذه المقالة ، سوف نغطي بالتفصيل الجديد في PHP 8.1. من الميزات الجديدة وتحسينات الأداء إلى التغييرات الهامة والإهمال ، سنتناولها جميعًا بعمق.

الميزات الجديدة في PHP 8.1

لنبدأ بتغطية جميع الميزات الجديدة في PHP 8.1. إنها قائمة تمامًا.

ملاحظة: قد تتسع هذه القائمة أو تتقلص مع اقتراب تاريخ إصدار PHP 8.1. سنهدف إلى إبقائه محدثًا.

أنواع تقاطعات نقية

Enums

نوع عدم الإرجاع أبدًا

ألياف

خصائص للقراءة فقط جديدة

تحديد ثوابت الفئة النهائية

وظائف fsync () و fdatasync () الجديدة

دالة array_is_list () جديدة

وظائف XChaCha20 الصوديوم الجديدة

فئة IntlDatePatternGenerator جديدة

دعم تنسيق صورة AVIF

_FILES دولار جديد: مفتاح full_path لتحميلات الدليل

دعم تفريغ الصفيف للصفائف ذات المفاتيح المتسلسلة

تدوين رقمي ثماني صريح

MurmurHash3 و xxHash دعم خوارزميات التجزئة

دعم DNS-over-HTTPS (DoH)

عمليات تحميل الملف من سلاسل باستخدام CURLStringFile

جديد MYSQLI_REFRESH_REPLICA ثابت

تحسينات في الأداء باستخدام ذاكرة التخزين المؤقت للوراثة

بناء الجملة القابل للاستدعاء من الدرجة الأولى

أنواع تقاطعات نقية

يضيف PHP 8.1 دعمًا لأنواع التقاطعات. إنه مشابه لأنواع الاتحاد المقدمة في PHP 8.0 ، لكن استخدامها المقصود هو عكس ذلك تمامًا.

لفهم كيفية استخدامها بشكل أفضل ، دعنا نعيد تحديث كيفية عمل تعريفات الكتابة في PHP.

بشكل أساسي ، يمكنك إضافة تعريفات الأنواع إلى وسيطات الوظيفة وقيم الإرجاع وخصائص الفئة. يُطلق على هذا الواجب اسم تلميح النوع ويضمن أن تكون القيمة من النوع الصحيح في وقت المكالمة. خلاف ذلك ، فإنه يطرح خطأ TypeError على الفور. وهذا بدوره يساعدك على تصحيح الأخطاء البرمجية بشكل أفضل.

ومع ذلك ، فإن الإعلان عن نوع واحد له حدوده. تساعدك أنواع الاتحاد في التغلب على ذلك من خلال السماح لك بإعلان قيمة بأنواع متعددة ، ويجب أن يلبي الإدخال على الأقل نوعًا واحدًا من الأنواع المعلنة.

من ناحية أخرى ، يصف RFC أنواع التقاطع على النحو التالي:

يتطلب “نوع التقاطع” قيمة لتلبية قيود نوع متعددة بدلاً من واحدة.

… يتم تحديد أنواع التقاطعات الخالصة باستخدام بناء الجملة T1 و T2 & … ويمكن استخدامها في جميع المواضع حيث يتم قبول الأنواع حاليًا …

لاحظ استخدام &عامل التشغيل (AND) للإعلان عن أنواع التقاطع. في المقابل ، نستخدم |عامل التشغيل (OR) للإعلان عن أنواع الاتحاد.

سيؤدي استخدام معظم الأنواع القياسية في نوع التقاطع إلى نوع لا يمكن تحقيقه أبدًا (مثل عدد صحيح وسلسلة). ومن ثم ، يمكن أن تتضمن أنواع التقاطع أنواع الفئات فقط (مثل الواجهات وأسماء الفئات).

فيما يلي مثال على رمز لكيفية استخدام أنواع التقاطع:

class A {
    private Traversable&Countable $countableIterator;
 
    public function setIterator(Traversable&Countable $countableIterator): void {
        $this->countableIterator = $countableIterator;
    }
 
    public function getIterator(): Traversable&Countable {
        return $this->countableIterator;
    }
}

في رمز أعلاه، قمنا بتعريف متغير countableIterator بمثابة تقاطع نوعين: عبورها و تعد Countable . في هذه الحالة ، النوعان المعلن عنها هما واجهات.

تتوافق أنواع التقاطع أيضًا مع قواعد تباين PHP القياسية المستخدمة بالفعل لفحص النوع والوراثة. ولكن هناك قاعدتان إضافيتان لكيفية تفاعل أنواع التقاطع مع التصنيف الفرعي. يمكنك قراءة المزيد حول قواعد تباين أنواع التقاطع في RFC الخاص بها.

في بعض لغات البرمجة ، يمكنك الجمع بين أنواع الاتحاد وأنواع التقاطع في نفس الإعلان. لكن PHP 8.1 تمنعه. ومن ثم ، فإن تنفيذه يسمى أنواع التقاطع “النقية”. ومع ذلك ، يذكر RFC أنه “يُترك كنطاق مستقبلي”.

Enums

يقوم PHP 8.1 أخيرًا بإضافة دعم للتعدادات (تسمى أيضًا التعداد أو الأنواع المعدودة). إنها نوع بيانات محدد من قبل المستخدم ويتكون من مجموعة من القيم الممكنة.

وتتضمن التعدادات المثال الأكثر شيوعا في لغات البرمجة هو منطقي نوع، مع trueو falseعن اثنين من القيم الممكنة. من الشائع جدًا أن يتم دمجها في العديد من لغات البرمجة الحديثة .

وفقًا لـ RFC ، ستقتصر التعدادات في PHP على “تعداد الوحدات” في البداية:

يقتصر نطاق RFC هذا على “تعداد الوحدات” ، أي التعدادات التي هي بحد ذاتها قيمة ، وليست مجرد صيغة خيالية لثابت بدائي ، ولا تتضمن معلومات إضافية مرتبطة. توفر هذه الإمكانية دعمًا موسعًا بشكل كبير لنمذجة البيانات وتعريفات الأنواع المخصصة والسلوك أحادي النمط. تمكن Enums تقنية النمذجة المتمثلة في “جعل الحالات غير الصالحة غير قابلة للتمثيل” ، مما يؤدي إلى رمز أكثر قوة مع حاجة أقل للاختبار الشامل.

للوصول إلى هذه المرحلة ، درس فريق PHP العديد من اللغات التي تدعم التعداد بالفعل. وجد الاستطلاع أنه يمكنك تصنيف التعدادات إلى ثلاث مجموعات عامة: الثوابت الفاخرة ، والأشياء الفاخرة ، وأنواع البيانات الجبرية الكاملة (ADTs). إنها قراءة ممتعة!

تنفذ PHP تعدادات “Fancy Objects” ، مع خطط لتوسيعها لتشمل ADTs كاملة في المستقبل. تم تصميمها من الناحية المفاهيمية والمعنوية على غرار الأنواع التي تم تعدادها في Swift و Rust و Kotlin ، على الرغم من أنها لم يتم تصميمها بشكل مباشر على أي منها.

يستخدم RFC القياس الشهير للبدلات في مجموعة من البطاقات لشرح كيفية عملها:

enum Suit {
  case Hearts;
  case Diamonds;
  case Clubs;
  case Spades;
}

هنا ، يحدد تعداد البدلة أربع قيم محتملة: القلوب ، الماس ، النوادي ، والبستوني . يمكنك الوصول إلى هذه القيم مباشرة باستخدام بناء الجملة: Suit::Hearts، Suit::Diamonds، Suit::Clubs، و Suit::Spades.

قد يبدو هذا الاستخدام مألوفًا ، حيث يتم إنشاء التعدادات فوق الفئات والأشياء. يتصرفون بشكل مشابه ولديهم المتطلبات الدقيقة تقريبًا. تشترك Enums في نفس مساحات الأسماء مثل الفئات والواجهات والسمات.

الأعداد المذكورة أعلاه تسمى Pure Enums .

يمكنك أيضًا تحديد Backed Enums إذا كنت تريد إعطاء قيمة مكافئة العددية لأي حالة. ومع ذلك ، يمكن أن تحتوي التعدادات المدعومة على نوع واحد فقط ، إما intأو string(كليهما مطلقًا).

enum Suit: string {
  case Hearts = 'H';
  case Diamonds = 'D';
  case Clubs = 'C';
  case Spades = 'S';
}

علاوة على ذلك ، يجب أن يكون لجميع الحالات المختلفة للتعداد المدعوم قيمة فريدة. ولا يمكنك أبدًا مزج الأعداد النقية والمدعومة.

يتعمق RFC في طرق التعداد والطرق الثابتة والثوابت والتعبيرات الثابتة وغير ذلك الكثير. تغطيتهم جميعًا خارج نطاق هذه المقالة. يمكنك الرجوع إلى الوثائق لتتعرف على كل خيرها.

و neverنوع الإرجاع

يضيف PHP 8.1 تلميحًا جديدًا لنوع الإرجاع يسمى never. من المفيد جدًا استخدامه في الوظائف التي دائمًا throwأو exit.

وفقًا لـ RFC ، فإن وظائف إعادة توجيه عنوان URL التي تعد دائمًا exit(صراحة أو ضمنيًا) مثالًا جيدًا لاستخدامها:

function redirect(string $uri): never {
    header('Location: ' . $uri);
    exit();
}
 
function redirectToLoginPage(): never {
    redirect('/login');
}

و neverظيفة -declared يجب تلبية ثلاثة شروط:

لا ينبغي أن يكون returnالبيان محددًا بشكل صريح.

لا ينبغي أن تحتوي على returnالعبارة المحددة ضمنيًا (على سبيل المثال ، عبارات if-else ).

يجب أن ينهي تنفيذه exitببيان (صريح أو ضمني).

و URL إعادة توجيه المثال أعلاه يظهر كلا استخدام الصريحة والضمنية من neverنوع الإرجاع.

و neverنوع الإرجاع يشارك العديد من أوجه الشبه مع voidنوع الإرجاع. كلاهما يضمن أن الوظيفة أو الطريقة لا تُرجع قيمة. ومع ذلك ، فإنه يختلف من خلال فرض قواعد أكثر صرامة. على سبيل المثال ، voidلا يزال بإمكان الدالة -declared returnبدون قيمة صريحة ، ولكن لا يمكنك فعل الشيء نفسه مع neverدالة -declared.

كقاعدة عامة ، انتقل مع voidالوقت الذي تتوقع أن تستمر PHP في التنفيذ بعد استدعاء الوظيفة. اذهب مع neverعندما تريد العكس.

علاوة على ذلك ، neverيتم تعريفه على أنه النوع “السفلي”. ومن ثم ، فإن أي طريقة صنف مُعلن عنها neverلا يمكنها “أبدًا” تغيير نوع الإرجاع الخاص بها إلى شيء آخر. ومع ذلك ، يمكنك توسيع voidأسلوب مُعرَّف باستخدام neverأسلوب مُعرَّف.

معلومات

يسرد RFC الأصلي neverنوع الإرجاع على أنه نوع noreturnإرجاع مدعوم بالفعل من قبل اثنين من أدوات التحليل الثابت PHP ، وهما Psalm و PHPStan. كما اقترح مؤلفو المزمور و PHPStan أنفسهم ، فقد احتفظوا بمصطلحاته. ومع ذلك ، نظرًا لاتفاقيات التسمية ، أجرى فريق PHP استطلاعًا لـ noreturnvs never، مع neverالظهور كفائز إلى الأبد. لذلك ، بالنسبة لإصدارات PHP 8.1+ ، استبدل دائمًا noreturnبـ never.

ألياف

تاريخيًا ، كان كود PHP دائمًا تقريبًا رمزًا متزامنًا. يتوقف تنفيذ الكود حتى يتم إرجاع النتيجة ، حتى لعمليات الإدخال / الإخراج. يمكنك أن تتخيل لماذا قد تجعل هذه العملية تنفيذ التعليمات البرمجية أبطأ.

هناك العديد من الحلول الخارجية للتغلب على هذه العقبة للسماح للمطورين بكتابة كود PHP بشكل غير متزامن ، خاصة لعمليات الإدخال / الإخراج المتزامنة. وتشمل بعض الأمثلة الشعبية amphp ، ReactPHP ، و أسرف في الشراب .

ومع ذلك ، لا توجد طريقة قياسية للتعامل مع مثل هذه الحالات في PHP. علاوة على ذلك ، تؤدي معالجة الكود المتزامن وغير المتزامن في مكدس الاستدعاءات نفسه إلى مشاكل أخرى .

الألياف هي طريقة PHP للتعامل مع التوازي عبر خيوط افتراضية (أو خيوط خضراء ). يسعى إلى إزالة الاختلاف بين الشفرة المتزامنة وغير المتزامنة من خلال السماح لوظائف PHP بالمقاطعة دون التأثير على مكدس الاستدعاءات بأكمله.

هذا ما يعد به RFC  :

إضافة دعم للألياف إلى PHP.

تقديم فئة الألياف الجديدة وفئة الانعكاس المقابلة ReflectionFiber.

إضافة استثناءات فئات FiberError و FiberExit لتمثيل الأخطاء.

تسمح الألياف بتطبيقات الإدخال / الإخراج الشفافة غير المحجوبة للواجهات الحالية (PSR-7 ، Doctrine ORM ، إلخ). هذا بسبب حذف الكائن النائب (الوعد). بدلاً من ذلك ، يمكن أن تعلن الدوال عن نوع نتيجة الإدخال / الإخراج بدلاً من كائن العنصر النائب الذي لا يمكنه تحديد نوع الدقة لأن PHP لا تدعم الأنواع.

يمكنك استخدام Fibers لتطوير وظائف PHP كاملة المكدس وقابلة للمقاطعة ، والتي يمكنك استخدامها بعد ذلك لتنفيذ المهام المتعددة التعاونية في PHP. نظرًا لأن Fibers تقوم بإيقاف مكدس التنفيذ بالكامل ، يمكنك أن تطمئن مع العلم أنها لن تضر بقية التعليمات البرمجية الخاصة بك.

رسم بياني يوضح تدفق تنفيذ كود PHP باستخدام Fibers.

لتوضيح استخدام الألياف ، يستخدم RFC هذا المثال البسيط:

$fiber = new Fiber(function (): void {
    $value = Fiber::suspend('fiber');
    echo "Value used to resume fiber: ", $value, "\n";
});
 
$value = $fiber->start();
 
echo "Value from fiber suspending: ", $value, "\n";
 
$fiber->resume('test');

أنت تنشئ “أليافًا” في الكود أعلاه وتعلقها على الفور بالسلسلة fiber. و echoيخدم البيان بوصفه وجديلة البصرية لاستئناف الألياف و.

يمكنك استرداد قيمة السلسلة هذه من المكالمة إلى $fiber->start().

بعد ذلك ، تستأنف الألياف الضوئية بالسلسلة “test” ، والتي يتم إرجاعها من الاستدعاء إلى Fiber::suspend(). ينتج عن تنفيذ التعليمات البرمجية بالكامل إخراج يقرأ:

Value from fiber suspending: fiber
Value used to resume fiber: test

هذا هو مثال الكتاب المدرسي المجرد لألياف PHP في العمل. فيما يلي مثال آخر للألياف لتنفيذ سبعة طلبات GET غير متزامنة.

مع كل ما يقال ويفعل ، لن يتعامل معظم مطوري PHP مع Fibers بشكل مباشر. ويقترح RFC الشيء نفسه:

الألياف هي ميزة متقدمة لن يستخدمها معظم المستخدمين بشكل مباشر. تستهدف هذه الميزة بشكل أساسي مؤلفي المكتبات وإطار العمل لتوفير حلقة حدث وواجهة برمجة تطبيقات برمجة غير متزامنة. تسمح الألياف بدمج تنفيذ التعليمات البرمجية غير المتزامن بسلاسة في رمز متزامن في أي وقت دون الحاجة إلى تعديل مكدس استدعاء التطبيق أو إضافة رمز معياري.

من غير المتوقع أن يتم استخدام واجهة برمجة تطبيقات Fiber مباشرة في التعليمات البرمجية على مستوى التطبيق. توفر الألياف واجهة برمجة تطبيقات أساسية منخفضة المستوى للتحكم في التدفق لإنشاء تجريدات ذات مستوى أعلى يتم استخدامها بعد ذلك في كود التطبيق.

بالنظر إلى مزايا الأداء ، يمكنك أن تتوقع أن تستفيد مكتبات PHP وأطر العمل من هذه الميزة الجديدة. سيكون من المثير للاهتمام معرفة كيفية قيامهم بتنفيذ الألياف داخل نظامهم البيئي.

readonlyخصائص جديدة

يضيف PHP 8.1 دعمًا readonlyللخصائص. يمكن تهيئتها مرة واحدة فقط من النطاق الذي تم الإعلان عنه فيه. بمجرد التهيئة ، لا يمكنك تعديل قيمتها أبدًا. سيؤدي القيام بذلك إلى ظهور استثناء خطأ .

 يقرأ RFC الخاص به :

لا يمكن تهيئة خاصية للقراءة فقط إلا مرة واحدة ، وفقط من النطاق الذي تم التصريح به فيه. أي تخصيص أو تعديل آخر للخاصية سينتج عنه استثناء خطأ.

فيما يلي مثال على كيفية استخدامه:

class Test {
    public readonly string $kinsta;
 
    public function __construct(string $kinsta) {
        // Legal initialization.
        $this->kinsta = $kinsta;
    }
}

بمجرد التهيئة ، لن يكون هناك عودة. إن امتلاك هذه الميزة في PHP يقلل بشكل كبير من الشفرة المعيارية التي تُستخدم غالبًا لتمكين هذه الوظيفة.

و readonlyيقدم الفندق ضمان ثبات قوي، سواء داخل أو خارج الصف. لا يهم الرمز الذي يتم تشغيله بينهما. readonlyسيؤدي استدعاء خاصية إلى إرجاع نفس القيمة دائمًا.

ومع ذلك ، readonlyقد لا يكون استخدام الخاصية مثاليًا في حالات استخدام محددة. على سبيل المثال ، يمكنك فقط استخدامها جنبًا إلى جنب مع خاصية مكتوبة لأن التعريفات التي لا تحتوي على نوع تكون ضمنية nullولا يمكن أن تكون كذلك readonly.

علاوة على ذلك ، فإن تحديد readonlyخاصية لا يجعل الكائنات غير قابلة للتغيير. و readonlyسوف تعقد الملكية نفس الكائن، ولكن هذا الكائن نفسه يمكن أن تتغير.

هناك مشكلة ثانوية أخرى تتعلق بهذه الخاصية وهي أنه لا يمكنك استنساخها. يوجد بالفعل حل بديل لحالة الاستخدام هذه . انظر إليها إذا لزم الأمر.

تحديد finalثوابت الفئة

بدءًا من PHP 8.0 ، يمكنك تجاوز ثوابت الفئة بفئاتها الفرعية. يرجع ذلك إلى طريقة تطبيق الوراثة في PHP.

فيما يلي مثال لكيفية تجاوز قيمة الثابت المعلن عنها مسبقًا:

class Moo
{
    public const M = "moo";
}
 
class Meow extends Moo
{
    public const M = "meow";
}  

الآن ، إذا أرادت الأبقار أن تصبح أكثر صرامة فيما يتعلق بسلوك القطط (على الأقل مع الثوابت) ، فيمكنهم فعل ذلك باستخدام مُعدِّل PHP 8.1 الجديد final.

بمجرد إعلان الثابت كـ final، فهذا يعني ذلك.

class Moo
{
    final public const M = "moo";
}
 
class Meow extends Moo
{
    public const M = "meow";
}
 
// Fatal error: Meow::M cannot override final constant Moo::M

يمكنك قراءة المزيد عنها في ثوابت الفئة النهائية PHP RFC.

جديد fsync()و fdatasync()ظائف

يضيف PHP 8.1 وظيفتين جديدتين لنظام الملفات باسم fsync()و fdatasync(). ستبدو مألوفة بالنسبة لأولئك الذين اعتادوا على وظائف Linux التي تحمل الاسم نفسه . هذا لأنهما مرتبطان ، تم تنفيذهما للتو من أجل PHP.

في الواقع ، لقد طال انتظار هذه الإضافة. PHP هي واحدة من لغات البرمجة الرئيسية القليلة التي لم تنفذ fsync () و fdatasync () – أي حتى PHP 8.1 .

و fsync()ظيفة مشابهة إلى القائمة PHP و fflush()ظيفة، ولكنه يختلف اختلافا كبيرا في اتجاه واحد. بينما fflush()يتدفق المخازن المؤقتة الداخلية للتطبيق إلى نظام التشغيل ، fsync()يتقدم خطوة أخرى ويضمن تدفق المخازن المؤقتة الداخلية إلى التخزين الفعلي . يضمن ذلك كتابة كاملة ومستمرة حتى تتمكن من استرداد البيانات حتى بعد تعطل أحد التطبيقات أو النظام.

فيما يلي مثال على كيفية استخدامه.

$doc = 'kinsta.txt';

$kin = fopen($doc, 'ki');
fwrite($kin, 'doc info');
fwrite($kin, "\r\n");
fwrite($kin, 'more info');

fsync($kin);
fclose($kin);

تضمن إضافة fsync()المكالمة في النهاية كتابة أي بيانات محفوظة في المخزن المؤقت الداخلي لنظام التشغيل أو PHP في التخزين. تم حظر جميع عمليات تنفيذ التعليمات البرمجية الأخرى حتى ذلك الحين.

وظيفتها ذات الصلة هي fdatasync(). استخدمه لمزامنة البيانات ولكن ليس بالضرورة البيانات الوصفية. بالنسبة للبيانات التي لا تكون بياناتها الوصفية ضرورية ، فإن استدعاء الوظيفة هذا يجعل عملية الكتابة أسرع قليلاً.

ومع ذلك ، يجب ملاحظة أن PHP 8.1 لا يدعم fdatasync()بشكل كامل على Windows حتى الآن. إنه يعمل فقط كاسم مستعار لـ fsync(). في POSIX ، fdatasync()يتم تنفيذه بشكل صحيح.

array_is_list()وظيفة جديدة

يمكن أن تحتوي مصفوفات PHP على مفاتيح عدد صحيح وسلسلة. هذا يعني أنه يمكنك استخدامها لعدة أشياء ، بما في ذلك القوائم وجداول التجزئة والقواميس والمجموعات والمكدسات وقوائم الانتظار وغير ذلك الكثير. يمكنك حتى أن يكون لديك مصفوفات داخل المصفوفات ، مما يؤدي إلى إنشاء مصفوفات متعددة الأبعاد.

يمكنك التحقق بكفاءة مما إذا كان إدخال معين عبارة عن مصفوفة ، ولكن ليس من السهل التحقق مما إذا كان به أي إزاحة مصفوفة مفقودة ، أو مفاتيح خارج الترتيب ، إلخ. باختصار ، لا يمكنك التحقق بسرعة مما إذا كانت المصفوفة قائمة أم لا.

و ظيفة array_is_list () يتحقق ما إذا مفاتيح مجموعة هي بالترتيب بدءا من 0ومع أي ثغرات. إذا تم استيفاء جميع الشروط ، فسيعود true. بشكل افتراضي ، يتم إرجاعه أيضًا trueللمصفوفات الفارغة.

وفيما يلي بعض الأمثلة على استخدامه مع كل trueو falseالظروف اجتمعت:

// true array_is_list() examples
array_is_list([]); // true
array_is_list([1, 2, 3]); // true
array_is_list(['cats', 2, 3]); // true
array_is_list(['cats', 'dogs']); // true
array_is_list([0 => 'cats', 'dogs']); // true
array_is_list([0 => 'cats', 1 => 'dogs']); // true 

// false array_is_list() examples 
array_is_list([1 => 'cats', 'dogs']); // as first key isn't 0
array_is_list([1 => 'cats', 0 => 'dogs']); // keys are out of order
array_is_list([0 => 'cats', 'bark' => 'dogs']); // non-integer keys
array_is_list([0 => 'cats', 2 => 'dogs']); // gap in between keys 

تعد قائمة مصفوفة PHP التي تحتوي على مفاتيح معطلة مصدرًا محتملاً للأخطاء . يعد استخدام هذه الوظيفة لفرض الالتزام الصارم بمتطلبات القائمة قبل المضي قدمًا في تنفيذ التعليمات البرمجية إضافة رائعة إلى PHP.

وظائف XChaCha20 الصوديوم الجديدة

الصوديوم عبارة عن مكتبة تشفير حديثة وسهلة الاستخدام للتشفير وفك التشفير وتجزئة كلمة المرور والتوقيعات والمزيد. في حزمة libsodium PECL يضيف المجمع لالصوديوم بحيث يمكن للمطورين PHP استخدامها.

حتى شركات التكنولوجيا الرائدة مثل Facebook و Discord و Malwarebytes و Valve تستخدم libsodium لتأمين مستخدميها من خلال اتصالات سريعة وآمنة.

يدعم libsodium خوارزمية تشفير XChaCha20 لتشفير البيانات وفك تشفيرها ، خاصة لتشفير الدفق. وبالمثل ، فإن امتداد PECL libsodium يدعم بالفعل XChaCha20 ، ولكن فقط مع رمز مصادقة الرسائل Poly1305.

تستخدم العديد من تطبيقات PHP XChaCha20 مباشرة لتشفير البث. لتسهيل الأمور ، بدءًا من PHP 8.1 ، سيكون لديك ثلاث وظائف جديدة لتشفير البيانات أو فك تشفيرها باستخدام XChaCha20 دون الحاجة إلى المصادقة. يسمى هذا الوضع “الوضع المنفصل”.

وظائف XChaCha20 التي تم تقديمها حديثًا هي:

sodium_crypto_stream_xchacha20_keygen: إرجاع مفتاح عشوائي آمن للاستخدام مع sodium_crypto_stream_xchacha20.

sodium_crypto_stream_xchacha20: يوسع المفتاح و nonce إلى تدفق مفاتيح من وحدات بايت عشوائية عشوائية.

sodium_crypto_stream_xchacha20_xor: تشفير رسالة باستخدام مفتاح nonce ومفتاح سري (بدون مصادقة).

بالإضافة إلى ذلك ، هناك نوعان من ثوابت PHP الجديدة المحددة في مساحة الاسم العالمية:

SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES(مكلف 32 )

SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES(تم تعيينه 24 )

استخدمه بحذر ، رغم ذلك. نظرًا لأنه بدون مصادقة ، فإن عملية فك التشفير معرضة لهجمات النص المشفر الشائعة.

يمكنك قراءة المزيد حول استخدامه ومتطلباته على صفحة GitHub .

فئة IntlDatePatternGenerator جديدة

تدعم مكتبة وحدة العناية المركزة الأساسية في PHP إنشاء تنسيقات التاريخ والوقت المترجمة ، ولكنها ليست قابلة للتخصيص بالكامل.

على سبيل المثال ، إذا كنت تريد إنشاء تنسيقات بيانات ووقت خاصة بالإعدادات المحلية حتى PHP 8.0 ، فيمكنك استخدام ثابت IntlDateFormatter المحدد مسبقًا للقيام بذلك في 6 طرق:

IntlDateFormatter::LONG: أطول ، مثل 10 تشرين الثاني (نوفمبر) 2017 أو 11:22:33 مساءً

IntlDateFormatter::MEDIUM: أقصر قليلاً ، مثل 10 تشرين الثاني (نوفمبر) 2017

IntlDateFormatter::SHORT: رقمي فقط ، مثل 10/11/17 أو 11:22 مساءً

يحتوي كل منها أيضًا على RELATIVE_متغيراته الخاصة ، والتي تحدد تنسيق التاريخ ضمن نطاق محدود قبل التاريخ الحالي أو بعده. في PHP، والقيم أمس ، اليوم ، و غدا .

لنفترض أنك تريد استخدام الإصدار الطويل للسنة والنسخة القصيرة للشهر ، مثل 10/11/2017 . اعتبارًا من PHP 8.0 ، لا يمكنك ذلك.

في PHP 8.1+ ، يمكنك تحديد التنسيقات التي يجب استخدامها للتاريخ والشهر والوقت باستخدام فئة IntlDatePatternGenerator الجديدة . يمكنك ترك الترتيب الدقيق لهذه المكونات للمنسق.

يجب أن تلاحظ أنه على الرغم من أن هذا الفصل يحتوي على كلمة التاريخ فقط ، إلا أنه يتوافق مع DateTimePatternGenerator الخاص بوحدة العناية المركزة . هذا يعني أنه يمكنك أيضًا استخدامه لإنشاء تنسيقات زمنية مرنة. لتبسيط التسمية ، اختار فريق PHP استخدام مصطلح IntlDatePatternGenerator الأقصر .

هذا مثال مباشر من RFC :

$skeleton = "YYYYMMdd";
 
$today = \DateTimeImmutable::createFromFormat('Y-m-d', '2021-04-24');
 
$dtpg = new \IntlDatePatternGenerator("de_DE");
$pattern = $dtpg->getBestPattern($skeleton);
echo "de: ", \IntlDateFormatter::formatObject($today, $pattern, "de_DE"), "\n";
 
$dtpg = new \IntlDatePatternGenerator("en_US");
$pattern = $dtpg->getBestPattern($skeleton), "\n";
echo "en: ", \IntlDateFormatter::formatObject($today, $pattern, "en_US"), "\n";
 
/*
de: 24.04.2021
en: 04/24/2021
*/

في الكود أعلاه ، يحدد متغير الهيكل التنسيقات الخاصة بالتاريخ أو الوقت التي يجب استخدامها. ومع ذلك ، فإن المنسق يعالج ترتيب النتيجة النهائية.

دعم تنسيق صورة AVIF

AVIF ، أو AV1 Image File Format ، هو تنسيق صورة خالٍ من حقوق الملكية جديد نسبيًا يعتمد على تنسيق ترميز الفيديو AV1. بصرف النظر عن تقديم ضغط أعلى (وبالتالي أحجام ملفات أصغر) ، فإنه يدعم أيضًا العديد من الميزات مثل الشفافية و HDR والمزيد.

تم توحيد تنسيق AVIF مؤخرًا فقط (8 يونيو 2021). وقد مهد ذلك الطريق أمام المتصفحات ، مثل Chrome 85+ و Firefox 86+ ، لإضافة دعم لصور AVIF.

تضيف معالجة الصور في PHP 8.1 وامتداد GD دعمًا لصور AVIF.

ومع ذلك ، لتضمين هذه الوظيفة ، تحتاج إلى تجميع امتداد GD مع دعم AVIF. يمكنك القيام بذلك عن طريق تشغيل الأوامر أدناه.

بالنسبة إلى Debian / Ubuntu:

apt install libavif-dev

بالنسبة إلى Fedora / RHEL:

dnf install libavif-devel

سيؤدي ذلك إلى تثبيت جميع التبعيات الأخيرة. بعد ذلك ، يمكنك ترجمة دعم AVIF عن طريق تشغيل –with-avifالعلم مع ./configureالبرنامج النصي.

./buildconf --force
./configure --enable-gd --with-avif

إذا كنت تبدأ بيئة جديدة من البداية ، فيمكنك أيضًا تمكين ملحقات PHP الأخرى هنا.

بمجرد التثبيت ، يمكنك اختبار ما إذا كان دعم AVIF ممكّنًا عن طريق تشغيل الأمر التالي في محطة PHP:

php -i | grep AVIF

إذا قمت بتثبيت AVIF بشكل صحيح ، فسترى النتيجة التالية:

AVIF Support => enabled

يمكنك أيضًا استخدام gd_info()المكالمة لاسترداد قائمة ميزات GD ، بما في ذلك ما إذا كانت وظيفة دعم AVIF ممكّنة.

يضيف ملحق PHP 8.1 GD المحدث وظيفتين جديدتين للعمل مع صور AVIF: imagecreatefromavifو imageavif. إنهم يعملون بشكل مشابه لنظرائهم من JPEG و PNG.

تقوم imagecreatefromavifالدالة بإرجاع نسخة GdImage من صورة AVIF معينة. يمكنك بعد ذلك استخدام هذا المثال لتحرير الصورة أو تحويلها.

تقوم imageavifالوظيفة الأخرى بإخراج ملف صورة AVIF. على سبيل المثال ، يمكنك استخدامه لتحويل JPEG إلى AVIF:

$image = imagecreatefromjpeg('image.jpeg');
imageavif($image, 'image.avif');

يمكنك قراءة المزيد حول هذه الميزة الجديدة على صفحة GitHub الخاصة بها .

$_FILES: full_pathمفتاح جديد لتحميلات الدليل

تحتفظ PHP بعدد كبير من المتغيرات المحددة مسبقًا لتتبع أشياء مختلفة. أحدها هو المتغير $ _FILES الذي يحتوي على مصفوفة ترابطية من العناصر التي تم تحميلها عبر طريقة HTTP POST.

معظم المتصفحات الحديثة تدعم تحميل دليل كامل مع تحميل ملف HTML المجالات. حتى PHP <8.1 تدعم هذه الوظيفة ، ولكن مع تحذير كبير. لا يمكنك تحميل مجلد بهيكل الدليل الدقيق الخاص به أو المسارات النسبية لأن PHP لم تمرر هذه المعلومات إلى $_FILESالمصفوفة.

تأثير التغيرات في PHP 8.1 مع إضافة مفتاح جديد يسمى full_pathل $_FILESمجموعة. باستخدام هذه البيانات الجديدة ، يمكنك تخزين المسارات النسبية أو تكرار بنية الدليل الدقيقة على الخادم.

يمكنك اختبار هذه المعلومات عن طريق إخراج $FILESالمصفوفة باستخدام var_dump($_FILES);الأمر.

ومع ذلك ، تابع بحذر إذا كنت تستخدم هذه الميزة. تأكد من حمايتك من هجمات تحميل الملفات القياسية .

دعم تفريغ الصفيف للصفائف ذات المفاتيح المتسلسلة

أضاف PHP 7.4 دعمًا لتفريغ الصفيف باستخدام عامل انتشار المصفوفة ( … ). يعمل كبديل أسرع لاستخدام array_merge()الوظيفة. ومع ذلك ، كانت هذه الميزة مقصورة على المصفوفات ذات المفاتيح الرقمية حيث تسبب تفريغ مصفوفات المفاتيح الوترية في حدوث تعارضات أثناء دمج المصفوفات بمفاتيح مكررة.

ومع ذلك ، أضافت PHP 8 دعمًا للوسيطات المسماة ، مما أدى إلى إزالة هذا القيد. ومن ثم ، فإن عملية تفريغ الصفيف ستدعم الآن المصفوفات ذات المفاتيح النصية باستخدام نفس الصيغة:

$array = [...$array1, ...$array2];

يوضح مثال RFC هذا كيفية دمج المصفوفات بمفاتيح سلسلة مكررة في PHP 8.1:

$array1 = ["a" => 1];
$array2 = ["a" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 2]

هنا ، يظهر مفتاح السلسلة “a” ثلاث مرات قبل الدمج عبر تفريغ المصفوفة. ولكن فقط قيمته الأخيرة تنتمي إلى $array2الانتصارات.

تدوين رقمي ثماني صريح

تدعم PHP أنظمة رقمية مختلفة ، بما في ذلك النظام العشري (الأساس -10) والثنائي (الأساس -2) والثماني (الأساس -8) والعشري (الأساس -16). نظام الأرقام العشري هو الافتراضي.

إذا كنت تريد استخدام أي نظام أرقام آخر ، فسيتعين عليك أن تسبق كل رقم ببادئة قياسية:

Hex: 0x بادئة. (على سبيل المثال 17 = 0x11)

ثنائي: 0b بادئة. (على سبيل المثال 3 = 0b11)

ثماني: 0 بادئة. (على سبيل المثال 9 = 011)

يمكنك أن ترى كيف تختلف بادئة نظام الأرقام الثماني عن البقية. لتوحيد هذا القلق ، تضيف العديد من لغات البرمجة دعمًا للتدوين الرقمي الثماني الصريح: 0oأو 0O.

بدءًا من PHP 8.1 ، يمكنك كتابة المثال الموضح أعلاه (أي رقم 9 في الأساس 10) في النظام العددي الثماني بصيغة 0o11أو 0O11.

0o16 === 14; // true
0o123 === 83; // true
 
0O16 === 14; // true
0O123 === 83; // true
 
016 === 0o16; // true
016 === 0O16; // true

علاوة على ذلك ، تعمل هذه الميزة الجديدة أيضًا مع فاصل حرفي رقمي للشرطة السفلية تم تقديمه في PHP 7.4.

اقرأ المزيد عن ميزة PHP 8.1 الجديدة هذه في RFC الخاص بها .

MurmurHash3 و xxHash دعم خوارزميات التجزئة

يضيف PHP 8.1 دعمًا لخوارزميات التجزئة MurmurHash3 و xxHash. لم يتم تصميمها لاستخدام التشفير ، لكنها لا تزال توفر عشوائية ناتجة مذهلة ، وتشتت ، وتفردًا.

تعد خوارزميات التجزئة الجديدة هذه أسرع من معظم خوارزميات التجزئة الموجودة في PHP. في الواقع ، بعض متغيرات خوارزميات التجزئة هذه أسرع من سعة ذاكرة الوصول العشوائي.

نظرًا لأن PHP 8.1 يضيف أيضًا دعمًا للإعلان عن $optionsمعلمات خاصة بالخوارزمية ، يمكنك فعل الشيء نفسه باستخدام هذه الخوارزميات الجديدة. القيمة الافتراضية لهذه الوسيطة الجديدة هي []. لذلك ، لن يؤثر ذلك على أي من وظائف التجزئة الموجودة لدينا.

تريد أن تعرف كيف زدنا من حركة المرور لدينا أكثر من 1000 ٪؟

يمكنك قراءة المزيد عن هذه PHP 8.1 الميزات الجديدة في الصفحات جيثب لهم: MurmurHash3 ، xxHash ، خوارزمية محددة الخيارات $ .

دعم DNS-over-HTTPS (DoH)

DNS-over-HTTPS (DoH) هو بروتوكول لتحليل DNS عبر بروتوكول HTTPS. باستخدام HTTPS لتشفير البيانات بين العميل ومحلل DNS ، تعمل DoH على زيادة خصوصية المستخدم وأمانه عن طريق منع هجمات MitM.

بدءًا من PHP 8.1 ، يمكنك استخدام امتداد Curl لتحديد خادم DoH . فهو يتطلب PHP التي سيتم تجميعها مع يبكورل 7.62+ الإصدارات. هذه ليست مشكلة بالنسبة لمعظم أنظمة التشغيل الشائعة ، بما في ذلك توزيعات Linux ، لأنها غالبًا ما تتضمن Curl 7.68+.

يمكنك تكوين عنوان URL لخادم DoH عن طريق تحديد CURLOPT_DOH_URLالخيار.

$doh = curl_init('https://kinsta.com');
curl_setopt($doh, CURLOPT_DOH_URL, 'https://dns.google/dns-query');
curl_exec($doh);

في المثال أعلاه ، استخدمنا خادم DNS العام لـ Google. لاحظ أيضًا استخدام https://جميع عناوين URL المستخدمة. تأكد من تكوين هذا بشكل مثالي حيث لا يوجد خادم DNS افتراضي للرجوع إليه في Curl.

يمكنك أيضًا الاختيار من قائمة خوادم DoH العامة المضمنة في وثائق Curl.

علاوة على ذلك ، يشرح المرجع CURLOPT_DOH_URL الخاص بوثائق Curl كيفية استخدام وسيطاته المتنوعة بدقة.

عمليات تحميل الملف من سلاسل باستخدام CURLStringFile

يدعم امتداد PHP Curl طلبات HTTP (S) مع تحميلات الملفات. يستخدم فئة CURLFile لتحقيق ذلك ، والذي يقبل URI أو مسار ملف ونوع mime واسم الملف النهائي.

ومع ذلك ، باستخدام فئة CURLFile ، يمكنك فقط قبول مسار الملف أو URI ، ولكن ليس محتويات الملف نفسه. في الحالات التي تم فيها تحميل الملف بالفعل في الذاكرة (مثل الصور المعالجة ومستندات XML وملفات PDF) ، كان عليك استخدام data://URIs مع تشفير Base64.

لكن libcurl يدعم بالفعل طريقة أسهل لقبول محتويات الملف. تضيف فئة CURLStringFile الجديدة دعمًا لذلك بالضبط.

يمكنك قراءة صفحة GitHub الخاصة به لمعرفة المزيد حول كيفية تنفيذه في PHP 8.1.

MYSQLI_REFRESH_REPLICAثابت جديد

يضيف ملحق mysqli في PHP 8.1 ثابتًا جديدًا يسمى MYSQLI_REFRESH_REPLICA. إنه مكافئ MYSQLI_REFRESH_SLAVEللثابت الموجود .

كان هذا التغيير موضع ترحيب في MySQL 8.0.23 لمعالجة عدم الحساسية العرقية في مفردات التكنولوجيا (الأمثلة الأكثر شيوعًا تشمل “العبد” و “السيد”).

يجب أن تلاحظ أن الثابت الأقدم لا يتم إزالته أو إهماله. يمكن للمطورين والتطبيقات الاستمرار في استخدامه. هذا الثابت الجديد ليس سوى خيار للمطورين والشركات الذين يرغبون في ترك هذه المصطلحات وراءهم.

تحسينات في الأداء باستخدام ذاكرة التخزين المؤقت للوراثة

الوراثة Cache هي إضافة جديدة إلى opcache تقضي على عبء توريث فئة PHP.

يتم تجميع فئات PHP وتخزينها مؤقتًا بواسطة opcache بشكل منفصل. ومع ذلك ، فقد تم ربطهم بالفعل في وقت التشغيل عند كل طلب. قد تتضمن هذه العملية العديد من فحوصات التوافق وطرق / خصائص / ثوابت الاقتراض من الفئات والسمات الأصلية.

ونتيجة لذلك ، يستغرق هذا وقتًا طويلاً للتنفيذ ، على الرغم من أن النتيجة واحدة لكل طلب.

يربط Inheritance Cache جميع الفئات التابعة الفريدة (الأصل ، والواجهات ، والسمات ، وأنواع الخصائص ، والطرق) ويخزن النتائج في الذاكرة المشتركة opcache. نظرًا لأن هذا يحدث مرة واحدة فقط الآن ، فإن الميراث تتطلب تعليمات أقل.

علاوة على ذلك ، يزيل القيود المفروضة على الفئات غير القابلة للتغيير ، مثل الثوابت التي لم يتم حلها والخصائص المكتوبة وفحوصات النوع المتغير. وبالتالي ، فإن جميع الفئات المخزنة في opcache غير قابلة للتغيير ، مما يقلل من عدد التعليمات المطلوبة.

الكل في الكل ، يعد بفوائد أداء كبيرة. وجد Dimitry Stogov ، مؤلف هذا التصحيح ، أنه أظهر تحسنًا بنسبة 8٪ على قاعدة Symfony الأساسية “Hello، World!” برنامج. لا يمكننا الانتظار لاختباره في معايير PHP التالية الخاصة بنا .

بناء الجملة القابل للاستدعاء من الدرجة الأولى

يضيف PHP 8.1 بناء جملة قابل للاستدعاء من الدرجة الأولى ليحل محل الترميزات الحالية باستخدام السلاسل والمصفوفات. إلى جانب إنشاء إغلاق أنظف ، يمكن الوصول إلى هذه البنية الجديدة أيضًا من خلال أدوات التحليل الثابتة وتحترم النطاق المعلن.

فيما يلي بعض الأمثلة المأخوذة من RFC :

$fn = Closure::fromCallable('strlen');
$fn = strlen(...);
 
$fn = Closure::fromCallable([$this, 'method']);
$fn = $this->method(...)
 
$fn = Closure::fromCallable([Foo::class, 'method']);
$fn = Foo::method(...);

هنا ، جميع أزواج التعبير متكافئة. بناء الجملة ثلاثي النقاط ( … ) يشبه صيغة تفريغ الوسيطة ( …$args). باستثناء هنا ، لم يتم ملء الحجج بعد.

التغييرات في PHP 8.1

يتضمن PHP 8.1 أيضًا تغييرات في تركيبته وميزاته الحالية. دعونا نناقشهم:

تتطلب PHP Interactive Shell تمديد readline

تم ضبط وضع الخطأ الافتراضي في MySQLi على استثناءات

نهايات خط قابلة للتخصيص لوظائف كتابة CSV

قيود مشغل الإصدار الجديد

وظائف تشفير وفك تشفير HTML استخدم الآن ENT_QUOTES | ENT_SUBSTITUTE

تحذير بشأن استدعاءات الوظيفة المدمجة غير القانونية

عمليات الترحيل الجديدة من الموارد إلى كائنات الفئة

تتطلب PHP Interactive Shell تمديد readline

يتيح ملحق readline الخاص بـ PHP ميزات shell التفاعلية مثل التنقل والإكمال التلقائي والتحرير والمزيد. على الرغم من كونه مدمجًا مع PHP ، إلا أنه لا يتم تمكينه افتراضيًا.

يمكنك الوصول إلى غلاف PHP التفاعلي باستخدام -aخيار سطر أوامر PHP CLI :

php -a

Interactive shell

php >
php > echo "Hello";
Hello
php > function test() {
php { echo "Hello";
php { }
php > test();
Hello

قبل إصدار PHP 8.1 ، كان بإمكانك فتح الغلاف التفاعلي باستخدام PHP CLI حتى بدون تمكين ملحق readline . كما هو متوقع ، لم تعمل الميزات التفاعلية للقذيفة ، مما يجعل -aالخيار بلا معنى.

في PHP 8.1 CLI ، يخرج الغلاف التفاعلي مع ظهور رسالة خطأ إذا لم تقم بتمكين ملحق readline .

php -a
Interactive shell (-a) requires the readline extension.
تم ضبط وضع الخطأ الافتراضي في MySQLi على استثناءات

قبل إصدار PHP 8.1 ، تخلفت MySQLi عن إسكات الأخطاء. غالبًا ما أدى هذا السلوك إلى رمز لا يتبع معالجة صارمة للخطأ / الاستثناء. كان على المطورين تنفيذ وظائف معالجة الأخطاء الصريحة الخاصة بهم.

يغير PHP 8.1 هذا السلوك عن طريق تعيين وضع الإبلاغ عن الأخطاء الافتراضي في MySQLi لطرح استثناء.

Fatal error: Uncaught mysqli_sql_exception: Connection refused in ...:...

نظرًا لأن هذا تغيير mysqli_reportفاصل ، بالنسبة لإصدارات PHP <8.1 ، يجب عليك تعيين وضع معالجة الأخطاء بشكل صريح باستخدام الوظيفة قبل إجراء أول اتصال MySQLi. بدلاً من ذلك ، يمكنك أن تفعل الشيء نفسه عن طريق تحديد قيمة الإبلاغ عن الخطأ عن طريق إنشاء mysqli_driverمثيل.

 يتبع RFC تغييرًا مشابهًا تم إدخاله في PHP 8.0 .

نهايات خط قابلة للتخصيص لوظائف كتابة CSV

قبل PHP 8.1، PHP الذي بني في CSV كتابة وظائف، fputcsvو SplFileObject::fputcsv، تم الثابت ترميز لإضافة \n (أو الحرف خط تغذية) في نهاية كل سطر.

يضيف PHP 8.1 دعمًا لمعامل جديد يسمى eolهذه الوظائف. يمكنك استخدامه لتمرير حرف قابل للتكوين في نهاية السطر. بشكل افتراضي ، لا يزال يستخدم \n الحرف. لذلك ، يمكنك الاستمرار في استخدامه في التعليمات البرمجية الموجودة لديك.

تنطبق قواعد هروب الأحرف القياسية على استخدام أحرف نهاية السطر. إذا كنت تريد استخدام \r، \nأو \r\nكأحرف في موسوعة الحياة ، فيجب عليك تضمينها بين علامتي اقتباس.

ها هي صفحة GitHub التي تتبع هذا التغيير الجديد.

version_compareقيود المشغل الجديد

version_compare()تقارن وظيفة PHP بين سلسلتين لرقم الإصدار. تقبل هذه الوظيفة وسيطة ثالثة اختيارية تسمى operatorلاختبار علاقة معينة.

وإن لم تكن مغطاة صراحة في وثائق، قبل PHP 8.1، هل يمكن تعيين هذه المعلمة إلى قيمة جزئية (على سبيل المثال g، l، n) دون أن تواجه خطأ.

يضيف PHP 8.1 قيودًا أكثر صرامة إلى حجة version_compare()الوظيفة operatorللتغلب على هذا الموقف. العوامل الوحيدة التي يمكنك استخدامها الآن هي:

== و = و مكافئ

! = و <> و ne

> و GT

> = و ge

< و lt

<= و جنيه

لا مزيد من قيم عامل التشغيل الجزئية .

هل تحتاج إلى حل استضافة يمنحك ميزة تنافسية؟ لقد جعلك Kinsta مغطى بسرعة لا تصدق وأحدث مستويات الأمان والتوسع التلقائي. تحقق من خططنا

تستخدم وظائف تشفير وفك تشفير HTML الآن ENT_QUOTES | ENT_SUBSTITUTE

كيانات HTML هي تمثيلات نصية للأحرف التي يمكن تفسيرها على أنها HTML. اعتقد من الشخصيات مثل <و >تستخدم ل تحديد علامات HTML (على سبيل المثال <a>، <h3>، <script>).

الكيان HTML ل <هو & lt;(أقل من الرمز) و >غير & gt;(أكبر من الرمز).

ملاحظة: أزل المسافة بين “&” و “أمبير”.

يمكنك استخدام كيانات HTML هذه بأمان في مستند HTML دون تشغيل محرك العرض في المتصفح.

على سبيل المثال ، & lt;script& gt;سوف تظهر كما <script>في المتصفح ، بدلاً من أن يتم تفسيرها على أنها علامة HTML.

قبل PHP 8.1، و htmlspecialchars () و htmlentities () وظائف تحويل رموز مثل “، <، >، و &إلى كيانات HTML الخاصة بهم. لكنهم لم يحولوا حرف الاقتباس الفردي ( ‘) إلى كيان HTML الخاص به افتراضيًا. علاوة على ذلك ، قاموا بإرجاع سلسلة فارغة إذا كان هناك UTF-8 غير صحيح في النص.

في PHP 8.1 ، ستعمل وظائف تشفير وفك تشفير HTML هذه (والوظائف المرتبطة بها) أيضًا على تحويل أحرف الاقتباس الفردية إلى كيان HTML الخاص بهم افتراضيًا.

وإذا كان النص المحدد يحتوي على أحرف غير صالحة ، فستستبدلها الوظائف بحرف استبدال Unicode ( ) بدلاً من إرجاع سلسلة فارغة. ينجز PHP 8.1 هذا عن طريق تغيير توقيعات هذه الوظائف إلى ENT_QUOTES | ENT_SUBSTITUTEبدلاً من ENT_COMPATافتراضيًا.

تستخدم معظم الأطر بالفعل ENT_QUOTESكقيمة العلم الافتراضية. لذلك ، لن ترى فرقًا كبيرًا بسبب هذا التغيير. ومع ذلك ، فإن ENT_SUBSTITUTEالعلم الجديد لا يستخدم على نطاق واسع. سيتسبب PHP 8.1 في استبدال أحرف UTF-8 غير الصالحة بالحرف “ بدلاً من إرجاع سلسلة فارغة.

تحذير بشأن استدعاءات الوظيفة المدمجة غير القانونية

compact()وظيفة PHP سهلة الاستخدام للغاية. يمكنك استخدامه لإنشاء مصفوفة بمتغيرات باستخدام أسمائها وقيمها.

على سبيل المثال ، ضع في اعتبارك الكود التالي:

$animal = 'Cat';
$sound = 'Meow';
$region = 'Istanbul';
compact('animal', 'sound', 'region');
// ['animal' => "Cat", 'sound' => "Meow", 'region' => "Istanbul"]

و ثائق وظيفة مدمجة ل تنص أنه سوف تقبل فقط معلمات سلسلة أو مجموعة القيم مع قيم السلسلة. ومع ذلك ، قبل إصدار PHP 7.3 ، سيتم تخطي أي سلاسل لم يتم تعيينها بصمت.

عدل PHP 7.3 compact()الوظيفة لإصدار إشعار إذا كنت تستخدم متغيرات غير محددة. يأخذ PHP 8.1 خطوة إلى الأمام ويطلق تحذيرًا.

يمكنك قراءة صفحة GitHub الخاصة به للتعرف على كيفية حدوث هذا التغيير.

عمليات الترحيل الجديدة من الموارد إلى كائنات الفئة

أحد أهداف PHP طويلة المدى هو الابتعاد عن الموارد نحو كائنات الفئة القياسية .

لأسباب تاريخية ، يتم استخدام كائنات الموارد على نطاق واسع في تطبيقات PHP. ومن ثم ، فإن ترحيل الموارد إلى كائنات الفئة يجب أن يكون أقل اضطرابًا قدر الإمكان. تقوم PHP 8.1 بترحيل خمسة من هذه الموارد:

تم file_infoترحيل المورد إلى finfoكائنات

تقدم فئة finfo في PHP واجهة كائنية المنحىfileinfo للوظائف. ومع ذلك ، يؤدي استخدام finfoالدوال إلى إرجاع resourceكائنات من file_infoالنوع بدلاً من مثيل finfoللفئة نفسها.

PHP 8.1 يصلح هذا الشذوذ .

تم ترحيل موارد IMAP إلى IMAP\Connectionكائنات الفئة

تماشياً مع هدف الترحيل من مورد إلى كائن ، IMAP\Connectionتقلل الفئة الجديدة من التغييرات المحتملة عندما تقوم PHP في النهاية بتعديل تفاصيل تنفيذ الفصل.

تم الإعلان عن هذه الفئة الجديدة أيضًا final، لذا لا يُسمح لك بها extend.

اقرأ المزيد حول تنفيذها على صفحة GitHub الخاصة بها .

أصبحت موارد اتصال FTP الآن FTP\Connectionكائنات فئة

في PHP <8.1 ، إذا قمت بإنشاء اتصال FTP مع ftp_connect()أو ftp_ssl_connect()وظائف ، فستستعيد كائن مورد من النوع ftp .

يضيف PHP 8.1 FTP\Connectionالفئة الجديدة لتصحيح ذلك. وكما هو الحال مع IMAP\Connectionالفصل ، فقد تم الإعلان أيضًا عن finalمنعه من التوسع.

اقرأ المزيد حول تنفيذها على صفحة GitHub الخاصة بها.

تم ترحيل معرفات الخطوط إلى GdFontكائنات الفئة

يوفر ملحق GD الخاص بـ PHP وظيفة imageloadfont () لتحميل صورة نقطية يحددها المستخدم وإرجاع معرف مورد معرف الخط (عدد صحيح).

في PHP 8.1 ، ستعيد هذه الوظيفة بدلاً من ذلك مثيل فئة GdFont . علاوة على ذلك ، لجعل الترحيل خاليًا من المتاعب ، imageloadfont()ستأخذ جميع الوظائف التي قبلت سابقًا معرف المورد من كائنات فئة GdFont الجديدة .

اقرأ المزيد حول هذا الترحيل على صفحة GitHub الخاصة به .

تم ترحيل موارد LDAP إلى الكائنات

يتم استخدام LDAP ، أو بروتوكول الوصول إلى الدليل الخفيف ، للوصول إلى “خوادم الدليل”. مثل بنية دليل القرص الصلب ، إنها قاعدة بيانات فريدة تحتوي على البيانات في هيكل شجرة.

تتضمن PHP امتداد LDAP الذي قبل أو أعاد كائنات الموارد قبل PHP 8.1. ومع ذلك ، فقد تم ترحيلهم جميعًا بسلاسة إلى مثيلات فئة جديدة الآن. و الموارد الأنواع التي تم تحويلها هي:

ldap linkمورد \LDAP\Connectionلكائن فئة

ldap resultمورد \LDAP\Resultلكائن فئة

ldap result entryمورد \LDAP\ResultEntryلكائن فئة

انتقل من خلال صفحة GitHub لفهم هذا الترحيل بشكل أفضل.

أصبحت موارد Pspell الآن كائنات فئة

يسمح لك ملحق Pspell الخاص بـ PHP بالتحقق من الإملاء واقتراحات الكلمات.

PHP <8.1 المستخدمة pspellو pspell configأنواع الكائنات الموارد مع معرف صحيح. يتم استبدال هذه الكائنات الموارد اثنين الآن مع PSpell\Dictionaryو PSpell\Configكائنات فئة.

مثل عمليات الترحيل السابقة ، ستأخذ جميع وظائف Pspell التي قبلت أو عرضت معرّفات كائن المورد في السابق مثيلات كائن الفئة الجديدة.

راجع صفحة GitHub الخاصة بها للحصول على مزيد من المعلومات.

الإهمال في PHP 8.1

PHP 8.1 يبطل العديد من ميزاته السابقة. توفر القائمة التالية نظرة عامة مختصرة على الوظائف التي لا تعمل PHP 8.1:

لا يمكن تمرير القيمة الفارغة إلى معلمات الوظيفة الداخلية غير الفارغة

الاستخدام المقيد لـ $ GLOBALS

إقرارات نوع الإرجاع للوظائف الداخلية

واجهة المسلسل موقوفة

تم إيقاف عدد التحويلات غير المتوافقة مع تحويلات int

تم إيقاف طريقة mysqli :: get_client_info و mysqli_get_client_info ($ param)

تم إيقاف جميع وظائف mhash * () (امتداد التجزئة)

تم إيقاف كل من filter.default و filter.default_options إعدادات INI

تستنكر autovivification على false

تم إهمال خاصية mysqli_driver-> driver_version

لا يمكن المرور nullإلى معلمات الوظيفة الداخلية غير الفارغة

اعتبارًا من PHP 8.0 ، تقبل وظائفها الداخلية بصمت nullالقيم حتى للوسيطات غير القابلة للقيم. لا ينطبق الشيء نفسه على الوظائف المعرفة من قبل المستخدم – فهم يقبلون فقط nullالوسيطات الفارغة.

على سبيل المثال ، ضع في اعتبارك هذا الاستخدام:

var_dump(str_contains("foobar", null));
// bool(true)

هنا ، nullيتم تحويل القيمة بصمت إلى سلسلة فارغة. وهكذا تعود النتيجة true.

يهدف RFC هذا إلى مزامنة سلوك الوظائف الداخلية عن طريق إصدار تحذير من الإهمال في PHP 8.1.

var_dump(str_contains("foobar", null));
// Deprecated: Passing null to argument of type string is deprecated

سيصبح الإهمال خطأ TypeError في إصدار PHP الرئيسي التالي (مثل PHP> = 9.0) ، مما يجعل سلوك الوظائف الداخلية متسقًا مع الوظائف التي يحددها المستخدم.

$GLOBALSاستخدام مقيد

$GLOBALSيوفر متغير PHP مرجعًا مباشرًا لجدول الرموز الداخلي الخاص به. يعد دعم هذه الوظيفة أمرًا معقدًا ويؤثر على أداء عمليات الصفيف. بالإضافة إلى ذلك ، نادرًا ما تم استخدامه.

وفقًا لـ RFC ، $GLOBALSلم يعد مسموحًا بالتعديل غير المباشر . هذا التغيير غير متوافق مع الإصدارات السابقة.

تأثير هذا التغيير منخفض نسبيًا:

في أفضل حزم مكونة من 2k ، وجدت 23 حالة تستخدم $ GLOBALS دون الرجوع إليها مباشرة. بناءً على الفحص السريع ، هناك حالتان فقط حيث لا يتم استخدام $ GLOBALS بطريقة للقراءة فقط.

ومع ذلك ، $GLOBALSيستمر استخدام القراءة فقط في العمل كالمعتاد. ما لم يعد مدعومًا هو الكتابة إلى $GLOBALSككل. نتيجة لذلك ، يمكنك توقع حدوث عثرة طفيفة في الأداء ، خاصة عند العمل مع مصفوفات PHP العادية.

إقرارات نوع الإرجاع للوظائف الداخلية

أتاحت PHP 8.0 للمطورين إعلان المعلمات وأنواع الإرجاع لمعظم الوظائف والأساليب الداخلية. كان ذلك ممكنًا بفضل RFCs المختلفة مثل أخطاء النوع الثابت للوظائف الداخلية و Union Types 2.0 و Mixed Type v2 .

ومع ذلك ، هناك العديد من الحالات التي قد تكون فيها معلومات النوع مفقودة. بعضهم تشمل نوع مع الموارد، من المعلمات تمرير كل المرجع، نوع الإرجاع أساليب غير النهائية، وظائف أو الأساليب التي لا المعلمات في التحليل وفقا للقواعد العامة. يمكنك قراءة التفاصيل الدقيقة في RFC الخاص بها .

هذا RFC يعالج فقط المشكلة مع نوع إرجاع الطرق غير النهائية. ومع ذلك ، بدلاً من التخلص التدريجي منه تمامًا على الفور ، يوفر فريق PHP مسار ترحيل تدريجي لتحديث قواعد التعليمات البرمجية الخاصة بك بأنواع إرجاع الطريقة ذات الصلة.

يتم الإعلان عن أنواع إرجاع الطريقة الداخلية غير النهائية – إن أمكن – مبدئيًا في PHP 8.1 ، وسيتم فرضها في PHP 9.0. هذا يعني أنه في إصدارات PHP 8.x ، يتم رفع إشعار “مهمل” أثناء عمليات التحقق من الوراثة عندما يتم تجاوز طريقة داخلية بطريقة تجعل أنواع الإرجاع غير متوافقة ، وسوف تجعل PHP 9.0 هذه خطأ فادحًا.

إذا رأيت إشعار الإيقاف هذا بعد التحديث إلى PHP 8.1 ، فتأكد من تحديث أنواع الإرجاع الخاصة بالطرق.

واجهة المسلسل موقوفة

قدم PHP 7.4 آلية تسلسل الكائن المخصص بطريقتين سحريتين جديدتين: __serialize()و __unserialize(). تهدف هذه الأساليب الجديدة إلى استبدال واجهة Serializable المعطلة في النهاية.

يقترح RFC هذا إنهاء هذا القرار من خلال وضع خطة للإزالة النهائية لـ Serializable .

في PHP 8.1، إذا كنت تنفيذ تسلسل اجهة دون تنفيذ __serialize()و __unserialize()الأساليب، سوف PHP رمي تحذير “متوقف”.

Deprecated: The Serializable interface is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in ... on line ...

إذا كنت تدعم PHP <7.4 و PHP> = 7.4 ، فيجب عليك تنفيذ كل من واجهة Serializable والطرق السحرية الجديدة. في إصدارات PHP> = 7.4 ، تكون الأولوية للطرق السحرية.

تم إيقاف إيقاف “غير متوافق floatمع intالتحويلات”

PHP هي لغة مكتوبة ديناميكيًا. على هذا النحو ، هناك العديد من الحالات التي يحدث فيها نوع الإكراه بشكل طبيعي. معظم هذه الإكراهات غير ضارة ومريحة للغاية.

ومع ذلك ، عندما يتم تحويل رقم عائم إلى عدد صحيح ، فإنه غالبًا ما ينطوي على فقدان البيانات. على سبيل المثال ، عندما يتم تحويل العدد 3.14 إلى عدد صحيح 3 ، فإنه يفقد قيمته الكسرية.

يحدث الشيء نفسه عندما يكون الطفو خارج نطاق عدد صحيح للنظام الأساسي ، أو عندما يتم تحويل سلسلة عائمة إلى عدد صحيح.

يصحح PHP 8.1 هذا السلوك ويجعل نوعه الديناميكي الإجباري أكثر انسجامًا مع معظم لغات البرمجة الحديثة. الهدف هو جعل مثل هذه الإكراهات قابلة للتنبؤ بها وبديهية.

في PHP 8.1 ، سترى إشعارًا بالإيقاف عندما يتم إجبار عدد عشري غير متوافق ضمنيًا على int . ولكن ما الذي يشكل عددًا صحيحًا متوافقًا مع عدد صحيح؟  يجيب RFC على هذا:

يقال أن العائمة متوافقة مع عدد صحيح إذا كانت تمتلك الخصائص التالية:

هو رقم (أي ليس NaN أو Infinity)

يقع في نطاق عدد صحيح PHP (يعتمد على النظام الأساسي)

لا يحتوي على جزء كسري

سيتم ترقية إشعار الإيقاف هذا إلى TypeError في إصدار PHP الرئيسي التالي (مثل PHP 9.0).

على mysqli::get_client_infoطريقة و mysqli_get_client_info($param)متوقف

تحدد واجهة برمجة تطبيقات عميل MySQL ثابتين: client_info(سلسلة) و client_version(int). يعد MySQL Native Driver (MySQLnd) جزءًا من مصدر PHP الرسمي ويربط هذه الثوابت بإصدار PHP. في libmysql ، يمثلون إصدار مكتبة العميل في وقت التجميع.

قبل إصدار PHP 8.1 ، كان mysqli يعرض هذه الثوابت بأربع طرق: mysqli_driverالخصائص ، والوظيفة ، والطريقة. رغم ذلك ، لا توجد طريقة لـ .mysqli propertiesmysqli_get_client_info()mysqli::get_client_infoclient_version

يعرض MySQLnd هذه الثوابت بطريقتين إلى PHP: استدعاء ثابت ودالة. لتوحيد طرق الوصول إلى mysqli بنفس الخيارين ، فإن PHP 8.1 تقوم بإهمال هذين الخيارين الآخرين:

get_client_infoالطريقة في فئة mysqli . بدلاً من ذلك ، يمكنك فقط استخدام mysqli_get_client_info()الوظيفة.

mysqli_get_client_info()تعمل مع المعلمات. قم باستدعاء الوظيفة بدون أي معلمات لتجنب إشعار الإيقاف.

اقرأ المزيد حول هذا الإهمال على صفحة GitHub الخاصة به .

تم mhash*()إيقاف جميع الوظائف (امتداد التجزئة)

تكامل mhash*()وظائف PHP 5.3 في ext/hashطبقة توافق لـ ext/mhash. لاحقًا ، تمت إزالة PHP 7.0 ext/mhash.

على عكس hash_*()الوظائف ، mhash*()الوظائف ليست متاحة دائمًا. يجب عليك تمكينها بشكل منفصل أثناء تكوين PHP.

في PHP 7.4 ، تم تجميع امتداد التجزئة مع PHP ، مما يجعله امتدادًا افتراضيًا لـ PHP. ومع ذلك ، لا يزال يدعم تمكين –enable-mhashالخيار لأسباب التوافق.

قرر فريق PHP إهمال وظائف mhash * () في PHP 8.1 ، وإزالتها تمامًا في PHP 9.0. وظائف إهمال و mhash()، mhash_keygen_s2k()، mhash_count()، mhash_get_block_size()و mhash_get_hash_name(). يمكنك استخدام ext/hashالوظيفة القياسية بدلاً منها.

كلا filter.defaultو filter.default_optionsINI إعدادات متوقف

PHP في filter.defaultالإعدادات INI يسمح لك تطبيق عامل تصفية لجميع PHP فائقة غلوبالس – أي GPCRS البيانات ( $_GET، $_POST، $_COOKIE، $_REQUEST، و $_SERVER).

على سبيل المثال ، يمكنك تعيين filter.default=magic_quotesأو filter.default=add_slashes(بناءً على إصدار PHP) لإحياء ميزة علامات الاقتباس السحرية المثيرة للجدل وغير الآمنة في PHP (تمت إزالتها في PHP 5.4).

و filter.defaultيوفر إعداد INI وظائف إضافية عن طريق السماح العديد من الفلاتر أكثر، مما يجعل من أسوأ. على سبيل المثال ، خياره الآخر – filter.default=special_chars- يمكّن علامات الاقتباس السحرية لـ HTML فقط. هناك وعي أقل بكثير بهذه الإعدادات.

سيطلق PHP 8.1 تحذيرًا بالإيقاف إذا filter.defaultتم تعيينه على أي قيمة بخلاف unsafe_raw(الافتراضي). لن ترى إشعارًا منفصلاً بالإيقاف لـ filter.default_options، ولكن PHP 9.0 سيزيل كلا إعدادي INI هذين.

كبديل ، يمكنك البدء في استخدام وظيفة filter_var () . يقوم بتصفية المتغيرات باستخدام المرشح المحدد.

يستنكر autovivificationعلى خطأ

تسمح PHP بالتحويل التلقائي (الإنشاء التلقائي لمصفوفات من قيم خاطئة). هذه الميزة مفيدة للغاية إذا كان المتغير غير محدد.

ومع ذلك ، ليس من المثالي إنشاء مصفوفة تلقائيًا عندما تكون القيمة خاطئة أو خالية.

لا يسمح طلب التعليقات هذا بالتحقق التلقائي من القيم الخاطئة. ومع ذلك ، لاحظ أنه لا يزال يُسمح بالتحويل التلقائي من المتغيرات غير المحددة والقيمة الفارغة.

في PHP 8.1 ، يؤدي إلحاق متغير من النوع false إلى إصدار إشعار إهمال:

Deprecated: Automatic conversion of false to array is deprecated in

PHP 9.0 سيحدث خطأ فادحًا لنفسه ، وهو مطابق للأنواع العددية الأخرى.

و mysqli_driver->driver_versionتم إهمال الملكية

تمديد MySQLi في mysqli_driver-> driver_version لم يتم تحديث الملكية لمدة 13 عاما. على الرغم من التغييرات العديدة التي تم إجراؤها على برنامج التشغيل منذ ذلك الحين ، إلا أنه لا يزال يُرجع قيمة إصدار برنامج التشغيل القديم ، مما يجعل هذه الخاصية بلا معنى.

في PHP 8.1 ، تم إهمال خاصية mysqli_driver-> driver_version .

تغييرات طفيفة أخرى

هناك العديد من الإهمالات في PHP 8.1 . سيكون إدراجهم جميعًا هنا تمرينًا مرهقًا. نوصيك بالتحقق مباشرة من RFC بحثًا عن هذه الإهمالات الطفيفة

تتضمن صفحة PHP’s GitHub أيضًا دليل PHP 8.1 UPGRADE NOTES . يسرد جميع التغييرات العاجلة التي يجب مراعاتها قبل الترقية إلى PHP 8.1.

ملخص

PHP 8.1 ليس بعيد المنال. وهي تعد بالفعل بفوزها على سابقتها ، وهذا ليس بالأمر الهين. عندما يتم إطلاقه ، يمكنك أن تطمئن إلى معرفة أن Kinsta ستدعم PHP 8.1 لكل من البيئات الحية والتشغيل المرحلي (بما في ذلك على DevKinsta ).

نعتقد أن أكثر ميزات PHP 8.1 إثارة هي Enums و Fibers و Pure Intersection Types والعديد من تحسينات الأداء. أيضًا ، لا يمكننا الانتظار لوضع PHP 8.1 خلال خطواته وقياس مختلف أطر عمل PHP وأنظمة إدارة المحتوى .

توضيح

اي عملية نسخ او اقتباس او ترجمة او نقل تم لاغراض علمية وتدريبية وتعليمية بحته وقد تم انشاء هذا المحتوى بمعرفة خبراء في مجال التقنية اما عن طريق إنشاء او تحرير او نقل او نسخ او اقتباس او ترجمة المحتوى من مصادر خاصة او عامة وكل ذلك ضمن حقوق النشر المتعارف عليها.

اي أخطاء تظهر في المحتوى مهما كان نوعه او تصنيفه يمكنك تحرير رسالة فورية لادارة موثوق لاجل تصحيح هذه الاخطاء، وسنكون شاكرين لك في حال قمت بالتعاون معنا لاجل اصلاح هذه الاخطاء.

أرسل تصحيح

شاركنا رايك وتقييمك للموضوع

{{ reviewsTotal }}{{ options.labels.singularReviewCountLabel }}
{{ reviewsTotal }}{{ options.labels.pluralReviewCountLabel }}
{{ options.labels.newReviewButton }}
{{ userData.canReview.message }}