التعرف على تحديثات PHP 8 - من صفر إلى مائة

التعرف على تحديثات PHP 8 - من صفر إلى مائة

تم إصدار PHP 8 في 6 ديسمبر 2019. هذا إصدار رئيسي جديد من PHP ، مما يعني أن هناك بعض التغييرات غير المتوافقة مع الإصدارات السابقة ، بالإضافة إلى العديد من الميزات الجديدة وتحسينات الأداء. PHP 8 مقفول حاليًا ، مما يعني أنه لا يمكن إضافة ميزات جديدة. ستساعدنا هذه المقالة في التعرف على تحديثات PHP 8.

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

بالإضافة إلى التغييرات غير المتوافقة ، قدمت PHP 8 مجموعة جيدة من الميزات الجديدة مثل مترجم JIT وأنواع الاتحاد والسمات والمزيد.

الميزات الجديدة لـ PHP 8

في هذا القسم ، سوف نفحص بعض الميزات الجديدة التي تمت إضافتها في الإصدار 8 من لغة PHP.

انواع Union

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


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

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


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

 

جيت

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

إذا كنت تريد معرفة المزيد عن JIT وما يفعله في PHP ، يمكنك استخدام هذه المقالة (+).

عامل nullsafe

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

اختياري

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


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

 

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

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


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

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

 

مميزات

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


use AppAttributesExampleAttribute;

#[ExampleAttribute]
class Foo
{
    #[ExampleAttribute]
    public const FOO = 'foo';
 
    #[ExampleAttribute]
    public $x;
 
    #[ExampleAttribute]
    public function foo(#[ExampleAttribute] $bar) { }
}

 


#[Attribute]
class ExampleAttribute
{
    public $value;
 
    public function __construct($value)
    {
        $this->value = $value;
    }
}

 

مطابقة العبارة

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


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

 

ترقية ميزة الباني

في الإصدار الجديد من 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,
    ) {}
}

بالطبع ، هناك الكثير مما يمكن قوله حول ترقيات الميزات ، ولكن الشرح التفصيلي يتجاوز نطاق هذا الدليل الموجز.

أنواع الإرجاع الثابتة الجديدة

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


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

 

نوع مختلط جديد

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

  • يمكن أن ترجع الدالة أي شيء أو Null.
  • يمكننا أن نتوقع نوعًا من عدة أنواع مختلفة.
  • يمكننا أن نتوقع نوعًا لا يحتوي على دليل للنوع في PHP.

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

  • مجموعة مصفوفة
  • منطقي
  • قابل للاستدعاء
  • int
  • تطفو
  • باطل
  • موضوع
  • الموارد
  • خيط

لاحظ أن مختلط يمكن أن يكون معلمة نوع سمة وليس نوع إرجاع.

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


// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type.
function bar(): ?mixed {}

 

صدور استثنا

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


$triggerError = fn () => throw new MyError();
$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');

 

الميراث بأساليب خاصة

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

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


Warning: Private methods cannot be final as they are never overridden by other classes

 

تعيينات ضعيفة

تمت إضافة تطبيق WeakMap على أساس ملفات ضعيفة تمت إضافتها إلى PHP في الإصدار 7.4 إلى اللغة في الإصدار الجديد. يحافظ WeakMap على مراجع للكائنات التي تمنع هذه الكائنات من أن يتم جمعها غير مهملة.

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

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


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

 

باستخدام :: فئة على الكائنات

ميزة أخرى جديدة ومفيدة في PHP هي القدرة على استخدام :: class على الكائنات. بهذه الطريقة ، بدلاً من استخدام get_class () على كائن ، يمكننا استخدام هذه الطريقة الجديدة. إنه يعمل مثل get_class ().


$foo = new Foo();
var_dump($foo::class);

 

المصيد غير الملتقط

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


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

الآن نستخدم الطريقة التالية:


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

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

إنهاء الفاصلة في قوائم المعلمات

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


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

لاحظ أن الفواصل اللاحقة في قائمة الاستخدام تدعمها أيضًا الجمل.

قم بإنشاء كائنات DateTime من الواجهة

يمكننا سابقًا إنشاء كائن DateTime من كائن DateTimeImmutable باستخدام الطريقة التالية:


DateTime::createFromImmutable($immutableDateTime)

لكن الطريقة الأخرى كانت معقدة. مع إضافة DateTime :: createFromInterface () و DatetimeImmutable :: createFromInterface () ، توجد الآن طريقة عامة لتحويل كائنات DateTime و DateTimeImmutable إلى بعضها البعض:


DateTime::createFromInterface(DateTimeInterface $other);
DateTimeImmutable::createFromInterface(DateTimeInterface $other);

 

واجهة جديدة Stringable

يمكن استخدام الواجهة Stringable كدليل نوع لأي شيء يقوم بتنفيذ toString (). عندما تقوم فئة ما بتنفيذ toString __ () ، فإنها تقوم تلقائيًا بتنفيذ الواجهة خلف الكواليس وليس هناك حاجة لتنفيذه يدويًا.


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

function bar(string|Stringable $stringable) { /* … */ }

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

 

تابع جدید ()str_contains

الآن لم نعد بحاجة إلى استخدام strpos () لمعرفة ما إذا كانت السلسلة تحتوي على سلسلة أخرى. بدلاً من ذلك ، قم بما يلي:


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

الآن نقوم بما يلي:


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

 

دالات جديدة str_starts_with () و str_ends_with ()

هاتان الوظيفتان تنتظران إضافتهما إلى PHP لفترة طويلة وقد تمت إضافتهما الآن إلى جوهر هذه اللغة:


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

 

وظيفة fdiv () الجديدة

تقوم الوظيفة fdiv () الجديدة بنفس عمل الدالتين fmod () و intdiv () ، وهي القدرة على القسمة على 0. بهذه الطريقة ، بدلاً من تلقي خطأ ، بناءً على نوع العملية ، يتم الحصول على قيم INF أو -INF أو NAN.

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

ترجع الدالة get_debug_type () متغير نوع. يوفر get_debug_type () مخرجات مفيدة أكثر بكثير للمصفوفات والسلاسل والفئات والكائنات المجهولة.

على سبيل المثال ، يؤدي استدعاء gettype () في فئة FooBar إلى إرجاع كائن. لكن استخدام get_debug_type () يؤدي إلى إرجاع اسم الفئة.

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

تعد الموارد نوعًا خاصًا من المتغيرات في PHP تشير إلى موارد خارجية. مثال على ذلك هو اتصال MySQL ومثال آخر هو مقبض الملف.

كل من هذه الموارد له معرّف. حتى الآن ، كانت الطريقة الوحيدة لمعرفة هذا المعرف هي تحويل المورد إلى نوع int:


$resourceId = (int) $resource;

قدم PHP 8 وظيفة get_resource_id () ، والتي تؤدي هذه العملية بطريقة أكثر شفافية وآمنة من النوع:


$resourceId = get_resource_id($resource);

 

طرق فردية في تحسينات الميزات

يمكن للسمات تحديد طرق مفردة يجب تنفيذها بواسطة الفصل الذي يستخدمها. ومع ذلك، هناك مشكلة. حتى 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 ()

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

التلاعب بالهيكل المتغير

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

اكتب التعليقات التوضيحية للوظائف المضمنة

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

ext-json متاح دائمًا

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

تغييرات غير متوافقة

كما ذكرنا في بداية هذه المقالة ، يعتبر الإصدار 8 من PHP إصدارًا رئيسيًا وبالتالي فقد أدخل تغييرات غير متوافقة مع الإصدارات السابقة. أفضل شيء يمكنك القيام به حيال ذلك هو إلقاء نظرة على قائمة هذه العناصر في هذا المستند (+). تم إهمال العديد من هذه التغييرات غير المتوافقة في إصدارات 7. * السابقة. لذلك إذا كنت قد حافظت على تحديث الكود الخاص بك على مر السنين ، فلن تكون الترقية إلى PHP 8 صعبة للغاية.

أخطاء النوع الموحد

تقوم الدوال المعرفة من قبل المستخدم في PHP دائمًا بإثارة TypeError ، لكن الدوال المضمنة لا تفعل ذلك ، بدلاً من ذلك تقوم بإعطاء تحذيرات وإرجاع القيمة null. في PHP 8 ، تم تغيير سلوك الوظائف الداخلية هذا ليكون أكثر توافقًا.

تم إعادة تصنيف تحذيرات المحرك

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

  • متغير غير محدد: ينتج استثناء خطأ بدلاً من تحذير.
  • فهرس مصفوفة غير محدد: يعطي تحذيرًا بدلاً من تحذير.
  • القسمة على الصفر: تنتج استثناء DivisionByZeroError بدلاً من تحذير.
  • محاولة زيادة / إنقاص السمة '٪ s' من non-object: إصدار استثناء خطأ بدلاً من تحذير.
  • محاولة تحرير السمة '٪ s' لـ non-object: ينتج عنها استثناء خطأ بدلاً من تحذير.
  • محاولة تعيين سمة تصغير لـ '٪ s' غير كائن: ينتج عنه استثناء خطأ بدلاً من تحذير.
  • إنشاء كائن افتراضي من قيمة فارغة: يطرح استثناء خطأ بدلاً من تحذير.
  • محاولة الحصول على سمة غير كائن '٪ s': ينتج عنها تحذير بدلاً من تحذير.
  • سمة غير محددة:٪ s :: $٪ s: ينتج عنها تحذير بدلاً من تحذير.
  • لا يمكن إضافة عنصر إلى المصفوفة لأن الفهرس التالي ممتلئ: يتم إنشاء استثناء خطأ بدلاً من تحذير.
  • لا يمكن إلغاء تحديد الإزاحة في متغير ليس مصفوفة: يتم إنشاء استثناء خطأ بدلاً من تحذير.
  • لا يمكن استخدام قيمة عددية كمصفوفة: يتم إنشاء استثناء خطأ بدلاً من تحذير.
  • يمكن فك ضغط المصفوفات والعناصر الانتقالية فقط: فهي تطرح استثناء TypeError بدلاً من تحذير.
  • تم توفير وسيطة غير صالحة لـ foreach (): يطرح استثناء TypeError بدلاً من تحذير.
  • نوع الإزاحة غير قانوني: يطرح استثناء TypeError بدلاً من تحذير.
  • نوع الإزاحة في المجموعة غير مسموح به أو فارغ: سوف يطرح استثناء TypeError بدلاً من تحذير.
  • نوع الإزاحة غير القانوني غير محدد: يطرح استثناء TypeError بدلاً من تحذير.
  • تحويل مصفوفة إلى سلسلة: يتم إعطاء تحذير بدلاً من تحذير.
  • تم استخدام معرف المصدر #٪ d كإزاحة وتحويله إلى عدد صحيح (٪ d): تحذير بدلاً من تحذير.
  • حدث تحويل إزاحة سلسلة: يتم إنشاء تحذير بدلاً من تحذير.
  • لم تتم تهيئة إزاحة السلسلة: يتم إنشاء تحذير بدلاً من تحذير.
  • لا يمكن تعيين سلسلة فارغة لإزاحة سلسلة: يتم إنشاء استثناء خطأ بدلاً من تحذير.
  • المورد المقدم ليس مورد دفق صالحًا: يظهر استثناء TypeError بدلاً من تحذير.

لم يعد العامل @ يمنع الأخطاء الفادحة

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

المستوى الافتراضي للإبلاغ عن الخطأ

في الإصدار الجديد ، يتم استخدام E_ALL بدلاً من كل شيء باستثناء E_NOTICE و E_DEPRECATED. هذا يعني أنه قد تظهر العديد من الأخطاء التي تم تجاهلها سابقًا في الوضع الصامت.

وضع خطأ PDO الافتراضي

وضع الخطأ الافتراضي الحالي لـ PDO هو "صامت". هذا يعني أنه في حالة حدوث خطأ في SQL ، فلن يتم إصدار أي خطأ أو تحذير ، ولن يتم رفع أي استثناء ، إلا إذا قام المطور بتنفيذ معالجة الأخطاء الصريحة الخاصة به. في الإصدار الجديد ، تم تغيير مستوى الخطأ الافتراضي لـ PDO إلى PDO :: ERRMODE_EXCEPTION.

تقدم الحاق

على الرغم من أنه تم إهمال هذا في PHP 7.4 ، فقد تم تنفيذه في الإصدار 8 من اللغة. وبالتالي ، إذا قمت بكتابة كود مثل ما يلي:


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

تستخدم PHP لتفسيرها على أنها:


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

لكن في PHP 8 ، سيتم تفسير هذا الكود على النحو التالي:


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

 

المزيد من عمليات التحقق من النوع الصريح للعوامل الحسابية والمعاملات الأحادية

قبل PHP 8 ، كان من الممكن استخدام العمليات الحسابية والعمليات الحسابية على المصفوفات والموارد والكائنات. هذا مهمل الآن ويؤدي إلى TypeError:


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

 

يتم تحويل الأسماء ذات "مساحة الاسم" إلى رمز مميز واحد

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

سلاسل رقمية أكثر منطقية

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

تحويل سلسلة إلى رقم بطريقة أكثر منطقية

في هذا التغيير ، جرت محاولة لتصحيح الموقف الغريب السابق في PHP حيث ينتج 0 == "foo" إلى True. كانت هناك بعض الأوضاع الخاصة الأخرى التي تم إصلاحها في هذا الإصدار.

تغيير توقيع طريقة عاكسة

تم تغيير ثلاثة تواقيع أسلوب للفئات العاكسة:


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);

 

فرز مستقر

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

خطأ فادح لتوقيعات الطريقة غير المتسقة

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

العناصر الأخرى المتقادمة والمعدلة

أثناء تطوير * .PHP 7 ، تمت إضافة بعض الإهمالات التي تم الانتهاء منها الآن في PHP 8. وتشمل هذه القائمة التالية:

  • موقوفة في PHP 7.2
  • موقوفة في PHP 7.3
  • موقوفة في PHP 7.4
  • تحويل نوع عائم إلى سلسلة تابعة محلية

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

ما هو رد فعلك؟

like

dislike

love

funny

angry

sad

wow