PHP 8.0: تقديم نسخة PHP الجديدة

يسعدنا أن نعلن أن PHP 8.0 متاح الآن على خوادم Hostinger. يأتي هذا الإصدار مع ميزات وتغييرات جديدة لتوفير أفضل أداء ممكن لمشاريع الويب الخاصة بك.

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

لماذا تحتاج PHP 8.0؟

أظهرت أحدث الاختبارات المعيارية التي أجرتها Phoronix أن PHP 8.0 تقدم أداء أفضل بنسبة 10٪ من سابقاتها. تشير هذه البيانات إلى مستقبل واعد لمواقع الويب والتطبيقات المستندة إلى PHP.

معيار PHP 9.0-rc5

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

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

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

تغيير إصدار PHP الخاص بك

يمكن لعملاء Hostinger اتباع هذه الخطوات لتحديث إصدار PHP الخاص بهم:

سجّل الدخول إلى hPanel وافتح لوحة معلومات حساب الاستضافة.

ضمن قسم Advanced ، انقر فوق تكوين PHP.

ستعرض علامة التبويب إصدار PHP لغة PHP التي تستخدمها. لتحديثه إلى أحدث إصدار ، حدد PHP 8.0 واضغط على Save.

تم تحديد PHP 8.0 على شاشة تكوينات PHP في لوحة التحكم

لاحظ أن التحديث قد يستغرق دقيقتين ليكتمل ويتسبب في عدم توفر موقع الويب الخاص بك مؤقتًا.

ما الجديد في PHP 8.0

هناك الكثير من التغييرات في جودة الحياة تأتي مع التحديث الجديد إلى جانب الكثير من الميزات الجديدة تمامًا. دعنا نستكشف الجديد وما الذي يتغير في PHP 8.0.

مترجم JIT (Just-in-Time)

يعد مترجم JIT أحد أكثر التحديثات إثارة في PHP 8.0. تهدف هذه الميزة إلى العمل مع opcache لتحسين الأداء في تنفيذ البرنامج النصي.

ما هو JIT؟

اختصارًا لـ “في الوقت المناسب” ، يجمع JIT كود التشغيل في كود الجهاز مباشرة قبل تشغيله للإخراج. لفهم معنى ذلك وكيف يعمل ، نحتاج إلى فهم مراحل تنفيذ نص PHP ، وهي:

التحليل المعجمي. هذه الخطوة هي المكان الذي يقوم فيه Zend Engine ، مترجم PHP ، بترجمة الشفرة إلى رموز يمكن قراءتها آليًا.

محلل. يوزع المترجم الرموز المميزة لإنشاء شجرة بناء الجملة المجردة (AST) – تمثيل يشبه الشجرة يوضح كيفية عمل الكود.

التحويل البرمجي. يقوم المترجم الفوري بتحويل عقد AST إلى كود تشغيل وهو تعليمة يمكن قراءتها آليًا تخبر جهاز Zend الظاهري (VM) بالعملية التي يجب تنفيذها.

تنفيذ. يسلم المترجم كود التشغيل إلى Zend VM ، والذي سيجمع كود التشغيل في كود الآلة للتنفيذ.

تستخدم هذه العملية قدرًا كبيرًا من موارد الخادم ، خاصةً إذا تلقى نص PHP النصي طلبات متكررة.

لهذا السبب قدم PHP 5.5 امتداد opcache ، والذي يخزن كود التشغيل من

مرحلة التجميع.

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

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

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

هذا هو المكان الذي يأتي فيه مترجم JIT. سيقوم بتجميع كود التشغيل في كود الآلة أثناء تشغيله الأول للتحضير للتنفيذ التالي.

عندما يكون هناك طلب لبرنامج نصي مترجم JIT ، ستقوم PHP بتشغيله مباشرة بواسطة وحدة المعالجة المركزية بدلاً من Zend VM ، مما يؤدي إلى أداء أسرع. إليك ما ستبدو عليه مراحل تنفيذ البرنامج النصي في PHP 8.0 ، مقارنة بالإصدار السابق:

مراحل تنفيذ البرنامج النصي PHP 8

هناك نوعان من محركات تجميع JIT:

وظيفة. سيحدد هذا النهج ويجمع وظيفة كاملة دون معرفة الأجزاء التي يتم استدعاؤها بشكل متكرر.

اقتفاء أثر. سيقوم هذا الوضع فقط بتحليل وتجميع الأجزاء الأكثر استخدامًا في الوظيفة لتوفير الوقت والذاكرة. هذا هو المحرك الافتراضي في PHP 8.0.

ماذا يعني JIT بالنسبة لي؟

وفقًا لـ RFC ، فإن تمكين JIT هو أهم طريقة لتحسين أداء PHP. وبالتالي ، قد يؤدي تخطي هذه الميزة إلى فقدان ميزة كبيرة.

لحسن الحظ ، تُظهر الاختبارات الأخيرة أن مترجم JIT كان قادرًا على تحسين عملية تنفيذ البرنامج النصي – بشكل أساسي إذا كنت تستخدم محرك التتبع.

تكشف معايير PHP الاصطناعية عن زيادة في السرعة أكبر بثلاث مرات بعد تمكين وضع التتبع. في التطبيقات التي تعمل لفترة طويلة ، يمكنك توقع رؤية تحسن في الأداء

NT بنسبة تصل إلى مرتين.

مساهمة JIT في أداء PHP 8

بالنسبة لمستخدمي ومطوري WordPress ، يمكن لمجمع JIT إضافة دفعة طفيفة أيضًا ، على الرغم من أنه قد لا يكون بنفس الأهمية.

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

إذا كنت تريد تمكين JIT ، فتأكد من أن ملحق opcache نشط.

يمكن لعملاء خطة الاستضافة المشتركة القيام بذلك عن طريق فتح لوحة معلومات حساب الاستضافة -> تكوين PHP. في علامة التبويب ملحقات PHP ، تأكد من تحديد مربع “opcache”.

شاشة ملحقات PHP

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

هناك الكثير من الميزات المثيرة إلى جانب JIT. سيقدم هذا القسم نظرة عامة على الإضافات والتغييرات الرئيسية في PHP 8.0.

أنواع الاتحاد 2.0

في كثير من الحالات ، يمكن للدالة استخدام أكثر من نوع واحد ، ولكن لم يكن من الممكن تحديد ذلك في إصدارات PHP السابقة إلا إذا أعلنت الأنواع باستخدام DocComments.

فيما يلي مثال لما يبدو عليه الأمر:

رقم الصف {

    / **

     *var int | float $ number

     * /

    رقم $ خاص ؛

    / **

     *param int | تعويم $ number

     * /

    setNumber الوظيفة العامة ($ number) {

        $ this-> رقم = $ number؛

    }

    / **

     *return int | تعويم

     * /

    getNumber الوظيفة العامة () {

        إرجاع $ this-> number؛

    }

}

قدمت إصدارات PHP السابقة نوعين خاصين من الاتحاد – Nullable (باستخدام بناء جملة النوع) و Iterable (للمصفوفة و Traversable).

ومع ذلك ، ما كان مفقودًا هو الدعم الأصلي لأنواع الاتحاد التعسفي ، وهي ميزة تأتي مع PHP 8.0. الآن ، يمكنك ببساطة كتابة الأنواع التي يمكن أن تستخدمها الوظيفة وفصلها باستخدام بناء الجملة T1 | T2 | … ، مثل:

رقم الصف {

    int الخاص | عدد $ float ؛

    setNumber الوظيفة العامة (int | float $ number): void {

        $ this-> رقم = $ number؛

    }

    الوظيفة العامة getNumber (): int | float {

        إرجاع $ this-> number؛

    }

}

لاحظ أن المثال لا يتضمنvar أوparam أوreturn بعد الآن ، مما يجعل الشفرة أكثر وضوحًا.

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

الحجج المسماة

في إصدارات PHP السابقة ، يتطلب تمرير وسيطات متعددة إلى دالة استخدام مواضع الترتيب التي تم فيها إعلان المعلمات ، مثل:

array_fill (0 ، 100 ، 50) ؛

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

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

// استخدام الحجج الموضعية:

array_fill (0 ، 100 ، 50) ؛

// استخدام الوسائط المسماة:

array_fill (start_index: 0، num: 100، value: 50) ؛

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

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

array_fill (القيمة: 50 ، العدد: 100 ، start_index: 0) ؛

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

test ($ foo، param: $ bar)؛

من ناحية أخرى ، سينتج عن هذا الرمز خطأ:

test (param: $ bar، $ foo)؛

أخيرًا ، باستخدام الوسائط المسماة ، ما عليك سوى كتابة المعلمات التي تريد الكتابة فوق قيمها الافتراضية. لا تتردد في تخطي القيم الافتراضية التي ترغب في الاحتفاظ بها. فيما يلي مثال تم توفيره في RFC:

htmlspecialchars ($ string، default، default، false) ؛

// ضد

htmlspecialchars ($ string، double_encode: false)؛

الصيغة القياسية للوسيطات المسماة paramName: $ value. لا تكتب الاسم بشكل ديناميكي ، كما هو موضح أدناه حيث سيؤدي ذلك إلى حدوث خطأ.

// غير معتمد.

function_name ($ variableStoringParamName: $ value) ؛

تطابق التعبيرات

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

ضع في اعتبارك مثال عبارة التبديل التالي من RFC:

التبديل ($ this-> lexer-> lookahead [‘type’]) {

    حالة ليكسر :: T_SELECT:

        كشف الحساب بالدولار = $ this-> SelectStatement () ؛

        فترة راحة؛

    حالة ليكسر :: T_UPDATE:

        كشف الحساب بالدولار = $ this-> UpdateStatement () ؛

        فترة راحة؛

    حالة ليكسر :: T_DELETE:

        كشف الحساب بالدولار = $ this-> DeleteStatement () ؛

        فترة راحة؛

    إفتراضي:

        $ this-> syntaxError (‘SELECT، UPDATE or DELETE’)؛

        فترة راحة؛

}

مع تعبير المطابقة ، ستبدو العبارة نفسها أقصر كثيرًا:

البيان $ = match ($ this-> lexer-> lookahead [‘type’]) {

    ليكسر :: T_SELECT => $ this-> SelectStatement () ،

    Lexer :: T_UPDATE => $ this-> UpdateStatement

() ،

    ليكسر :: T_DELETE => $ this-> DeleteStatement () ،

    افتراضي => $ this-> syntaxError (‘SELECT أو UPDATE أو DELETE’) ،

} ؛

يوضح مقطع التعليمات البرمجية أعلاه أن تعبير المطابقة يمكن أن يُرجع قيمة. هذا على عكس بيان التبديل حيث يتعين عليك تعيين نتيجة $ في النهاية.

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

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

التبديل (‘foo’) {

    الحالة 0:

      نتيجة $ = “أوه لا! \ n”؛

      فترة راحة؛

    الحالة “foo”:

      نتيجة $ = “هذا ما توقعته \ n”؛

      فترة راحة؛

}

صدى $ نتيجة؛

//> أوه لا!

سيقدم تعبير المطابقة نتيجة أكثر ملاءمة:

تطابق الصدى (“foo”) {

    0 => “أوه لا! \ n”،

    ‘foo’ => “هذا ما توقعته \ n” ،

} ؛

//> هذا ما توقعته

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

صفات

السمة هي وظيفة بيانات وصفية يمكنها توثيق معنى قسم من التعليمات البرمجية. يمكن للمطورين وضعها في الوظائف والفئات وثوابت الفئة وخصائص الفئة وطرق الفئة ومعلمات الوظيفة أو الطريقة.

تشبه هذه الميزة DocComments ، على الرغم من وجود بعض الاختلافات.

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

للدلالة على السمات ، ضع النص بين رمزين أصغر من وأكبر من ، مثل <<مثال>>. يمكنك إضافتها قبل التصريحات التي تحددها ، مثل:

<<ExampleAttribute>>

فئة فو

{

    <<ExampleAttribute>>

    public const FOO = ‘foo’ ؛

    <<ExampleAttribute>>

    عامة $ x ؛

    <<ExampleAttribute>>

    public function foo (<<ExampleAttribute>> $ bar) {}

}

علاوة على ذلك ، يمكن للمستخدمين تضمين قيمة واحدة أو عدة قيم مرتبطة في السمة ، كما هو موضح أدناه:

<<بدون وسيطة>>

<< وسيطة واحدة (0) >>

<< FewArguments (‘Hello’، ‘World’) >>

function foo () {}

من الممكن أيضًا إرفاق السمات قبل DocComment أو بعده.

<<ExampleAttribute>>

/ ** docblock * /

<<AnotherExampleAttribute>>

function foo () {}

ترويج ممتلكات المنشئ

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

في إصدارات PHP السابقة ، كان بإمكان المرء تحديد كائنات ذات قيمة بسيطة عن طريق تكرار الخصائص – مرة واحدة في إعلان الخاصية ، ومرة ​​واحدة في معلمات المُنشئ ، ومرتين في تعيينات الخاصية. ألق نظرة على المثال التالي:

فئة نقطة {

    التعويم العام $ x؛

    التعويم العام $ y؛

    التعويم العام $ z؛

    الوظيفة العامة __construct (

        تعويم $ x = 0.0 ،

        تعويم $ y = 0.0 ،

        تعويم $ z = 0.0 ،

    ) {

        $ this-> x = $ x ؛

        $ this-> y = $ y؛

        $ this-> z = $ z ؛

    }

}

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

فئة نقطة {

    الوظيفة العامة __construct (

        تعويم عام $ x = 0.0 ،

        تعويم عام $ y = 0.0 ،

        التعويم العام $ z = 0.0 ،

    ) {}

}

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

يوضح RFC أن هناك العديد من القيود التي يجب مراعاتها مع ترويجات خاصية المُنشئ. الأول هو تجنب استخدام الكلمات الرئيسية var ، حيث تتطلب الميزة بالفعل الترويج للخصائص باستخدام علامة الرؤية.

اختبار فئة {

    // خطأ: الكلمة الأساسية “var” غير مدعومة.

    الوظيفة العامة __construct (var $ prop) {}

}

ثانيًا ، عندما يكون النوع فارغًا ، يجب التصريح عنه صراحة باستخدام بناء جملة النوع nullable.

اختبار فئة {

    // خطأ: استخدام القيمة الافتراضية الفارغة على خاصية غير قابلة للإلغاء

    public function __construct (public Type $ prop = null) {}

    // تصحيح: اجعل النوع فارغًا بشكل صريح بدلاً من ذلك

    public function __construct (public؟ اكتب $ prop = null) {}

}

يمكن أن تحدث المعلمات التي يتم الترويج لها فقط في المنشئات غير المجردة. وبالتالي ، سينتج عن المثال التالي خطأ:

// خطأ: ليس منشئ.

اختبار الوظيفة ($ x الخاص) {}

اختبار فئة مجردة {

    // خطأ: مُنشئ الملخص.

    الوظيفة العامة المجردة __construct (private $ x) ؛

}

يمكن للفئة أن تحتوي على كل من الخصائص التي يروج لها المُنشئ وإعلانات الخصائص الصريحة. ومع ذلك ، لا يمكن استخدام نفس الخاصية في كليهما ، مثل:

اختبار فئة {

    الدعامة $ العامة ؛

    // خطأ: إعادة تعريف الخاصية.

    public function __construct (public $ prop) {}

}

لا يوجد أيضًا تعزيز للمعلمات المتغيرة في المنشئات.

اختبار فئة {

// خطأ: معلمة متغيرة.

    الوظيفة العامة __construct (سلسلة عامة … سلاسل $) {}

}

أخيرًا ، لا يوجد دعم لاستخدام النوع القابل للاستدعاء في إعلان خاصية المنشئ.

اختبار فئة {

    // خطأ: النوع القابل للاستدعاء غير معتمد للخصائص.

    public function __construct (public callback $) {}

}

مشغل Nullsafe

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

بلد $ = لا شيء ؛

إذا ($ session! == null) {

    $ user = $ session-> user؛

    إذا ($ user! == null) {

        العنوان $ = $ user-> getAddress ()؛

        إذا ($ address! == null) {

            الدولة $ = العنوان-> الدولة ؛

        }

    }

}

// افعل شيئًا باستخدام $ country

للتغلب على هذه المشكلة ، تقدم PHP 8.0 العامل nullsafe. باستخدام هذه الميزة ، يمكنك كتابة الكود من المثال أعلاه باستخدام؟ -> بناء الجملة.

$ country = $ session؟ -> user؟ -> getAddress ()؟ -> country؛

// افعل شيئًا باستخدام $ country

وفقًا لـ RFC ، ستتحقق PHP مما إذا كانت جلسة المشغل الأولى $ خالية. إذا لم يحدث ذلك ، فسيستمر التنفيذ حتى آخر عامل. ستوقف PHP عملية التنفيذ عندما يقيّم أحد المشغلين قيمة خالية.

أحد القيود على استخدام عامل nullsafe هو أنه لا يمكن أن يوجد في سياق الكتابة. نتيجة لذلك ، سيؤدي ما يلي إلى حدوث خطأ:

foreach ([1، 2، 3] كـ $ foo؟ -> bar-> baz) {}

// لا يمكن استخدام عامل التشغيل nullsafe في سياق الكتابة

بالإضافة إلى ذلك ، لا يُسمح باستخدام مرجع لسلسلة خالية من الأمان.

// 1

$ x = & $ foo؟ -> bar؛

// خطأ مترجم: لا يمكن أخذ مرجع لسلسلة خالية من الأمان

// 2

take_ref ($ foo؟ -> شريط) ؛

// خطأ: لا يمكن تمرير المعلمة 1 حسب المرجع

// 3

function & return_by_ref ($ foo) {

    إرجاع $ foo؟ -> شريط؛

    // خطأ مترجم: لا يمكن أخذ مرجع لسلسلة خالية من الأمان

}

خرائط ضعيفة

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

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

المثال أدناه ، مأخوذ من RFC ، والذي يوضح كيف ستبدو الخرائط الضعيفة:

$ map = خريطة WeakMap جديدة ؛

$ obj = stdClass جديد ؛

خريطة $ [$ obj] = 42 ؛

var_dump (خريطة $) ؛

// object (WeakMap) # 1 (1) {

// [0] =>

// مجموعة (2) {

// [“مفتاح”] =>

// object (stdClass) # 2 (0) {

//}

// [“القيمة”] =>

// int (42)

//}

//}

// يتم تدمير الكائن هنا ، ويتم إزالة المفتاح تلقائيًا من الخريطة الضعيفة.

unset ($ obj) ؛

var_dump (خريطة $) ؛

// object (WeakMap) # 1 (0) {

//}

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

ميزات جديدة طفيفة

فيما يلي بعض الميزات الإضافية البسيطة التي يمكنك توقعها من PHP 8.0:

الفواصل اللاحقة في قوائم المعلمات. يمكنك سرد المعلمات بتنسيق رأسي بدلاً من المعيار الأفقي.

str_contains (). ستفحص هذه الوظيفة ما إذا تم دمج سلسلة كعنصر في سلسلة أخرى. سيعيد قيمة منطقية اعتمادًا على ما إذا كان الشرط صحيحًا أم خطأ. يمكنك اعتباره بديلاً أكثر قابلية للقراءة لـ str_pos ().

str_starts_with (). سيتحقق مما إذا كانت السلسلة تبدأ بسلسلة فرعية محددة.

str_ends_with (). سيحدد ما إذا كانت السلسلة تنتهي بسلسلة فرعية معينة.

واجهة Stringable. سيتم الآن تنفيذ واجهة Stringable تلقائيًا للفئات التي تستخدم طريقة __toString (). الهدف هو السماح للسلسلة | نوع الاتحاد Stringable ، مما يعني أن PHP يمكن أن تقبل إما سلسلة أو كائنًا باستخدام طريقة __toString ().

fdiv (). يقبل PHP 8.0 القسمة على الصفر وسيرجع INF أو -INF أو NAN بدلاً من الخطأ.

get_debug_type (). تعمل هذه الوظيفة بشكل مشابه لـ gettype () ، على الرغم من أنها ستعيد أسماء الأنواع الأصلية وأسماء الفئات. يوضح الجدول المرجعي أدناه كيف يختلف الاثنان.

الجدول المرجعي PHP 8

get_resource_id (). هذه الوظيفة هي بديل آمن للنوع لمورد (int) $. سيقوم بجلب معرف مورد خارجي ، مثل اتصال قاعدة البيانات.

PhpToken :: tokenize (). ستحل هذه الطريقة محل وظيفة token_get_all (). بدلاً من إرجاع سلاسل أو مصفوفات من القيم ، ستعيد مصفوفة من الكائنات. سيكون الرمز الناتج أكثر قابلية للقراءة وفعالية في الذاكرة.

معيار المعيشة الجديد لـ DOM في ext / dom. واجهات جديدة وخصائص عامة للتكيف مع واجهات برمجة تطبيقات DOM الحالية ، والتي أصبحت ضرورية عند التعامل مع مستندات XML و HTML.

الميزات المهملة في PHP 8.0

سيقوم PHP 8.0 بإهمال الميزات التالية:

تضمين قيمة افتراضية في معلمة متبوعة بمعامل مطلوب ، لأن القيمة الافتراضية ليس لها أي تأثير

استخدام get_defined_functions () مع خاصية include_disabled مضبوطة صراحةً على false

دالة enchant_broker_set_dict_path ()

دالة enchant_broker_get_dict_path ()

en

chant_dict_add_to_personal () وظيفة

دالة enchant_dict_is_in_session ()

دالة enchant_broker_free ()

دالة enchant_broker_free_dict ()

ENCHANT_MYSPELL ثابت

ENCHANT_ISPELL ثابت

دالة libxml_disable_entity_loader ()

ثابت PGSQL_LIBPQ_VERSION_STR ، مع بعض الأسماء المستعارة للوظائف في امتداد pgsql

استخدام دوال مقارنة الفرز التي ترجع صواب أو خطأ

استخدام ملف فارغ مثل ZipArchive

واجهة برمجة تطبيقات Zip الإجرائية

وظيفة ReflectionFunction :: isDisabled ()

ReflectionParameter :: getClass () وظيفة

ReflectionParameter :: isArray () وظيفة

ReflectionParameter :: isCallable () وظيفة

تحقق من هذا المورد لمزيد من المعلومات حول الميزات المهملة.

التغييرات غير المتوافقة مع الإصدارات السابقة لـ PHP 8.0

يأتي الترحيل إلى PHP 8.0 بالعديد من التغييرات غير المتوافقة مع إصدارات PHP الأقدم. بعضها يشمل:

سلسلة إلى مقارنة رقم. ستظهر الآن مقارنة الأرقام بالسلاسل غير الرقمية على أنها خاطئة. انظر الجدول المرجعي أدناه:

PHP 8 جدول مقارنة سلاسل

لا توجد مسافة بيضاء في الأسماء ذات المسافات. على سبيل المثال ، لن يتم قبول أسماء مثل “Foo \ bar”. استخدم “Foo \ bar” بدلاً من ذلك.

مورد لاعتراض الترحيل. ستعيد بعض الوظائف الآن كائنًا بدلاً من مورد.

إزالة علامتي FILTER_FLAG_SCHEME_REQUIRED و FILTER_FLAG_HOST_REQUIRED. هذا لأن FILTER_VALIDATE_URL يستخدم بالفعل هذه العلامات افتراضيًا عند دمجها مع وظيفة filter_var ().

E_ALL هو الآن مستوى الإبلاغ عن الأخطاء الافتراضي. سيتضمن PHP 8.0 الإشعارات والتغييرات المهملة في رسائل الخطأ.

تأكد من قراءة الوثائق الرسمية لرؤية التغييرات الأخرى غير المتوافقة مع الإصدارات السابقة.

تغييرات PHP 8.0 الأخرى

لن تؤدي التغييرات أدناه إلى عدم توافق مع الإصدارات السابقة ، ولكن لا يزال من الضروري ملاحظتها. بعضها يشمل:

يمكنك تصفية النتائج من ReflectionClass :: getConstants () و ReflectionClass :: getReflectionConstants () باستخدام معامل التصفية الجديد.

تقبل الآن أساليب ZipArchive :: addGlob () و ZipArchive :: addPattern () الأعلام و comp_method و comp_flags و env_method و enc_password في مصفوفة الخيارات.

توجد وسيطة إشارات جديدة لطرق ZipArchive :: addEmptyDir () و ZipArchive :: addFile () و ZipArchive :: addFromString ().

نظرًا لدورها الأساسي في PHP ، يتم الآن تمكين امتداد JSON افتراضيًا.

لن تضطر الدالة array_slice () إلى إيجاد موضع البداية إذا لم تكن المصفوفة بها فراغات.

يمكن أن يوفر هذا المورد مزيدًا من المعلومات حول التغييرات.

WordPress و PHP 8.0

يتوافق WordPress 5.6 وما بعده مع PHP 8.0. قام فريق المطورين بإزالة العديد من الميزات المهملة لتحقيق ذلك.

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

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

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

تذكر أنه يمكنك دائمًا الرجوع إلى إصدار أقدم حتى PHP 7.4 إذا كان هناك العديد من المشكلات المتبقية لحلها.

استنتاج

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

تأكد من إطلاعك على RFCs والوثائق حتى تكون مشاريعك متوافقة تمامًا مع أحدث إصدار من PHP. حظا طيبا وفقك الله!

Leave a comment

Your email address will not be published. Required fields are marked *