الأصناف المجهولة في PHP

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث

أُضيف دعم الأصناف المجهولة إلى الإصدار السابع من PHP، وهي مفيدة عند الحاجة إلى إنشاء نسخة واحدة بسيطة من الصنف.

<?php

// قبل الإصدار السابع
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

// الإصدار السابع وما بعده
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});
?>

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

<?php

class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}

var_dump(new class(10) extends SomeClass implements SomeInterface {
    private $num;

    public function __construct($num)
    {
        $this->num = $num;
    }

    use SomeTrait;
});
?>

يعطي المثال السابق النتيجة التالية:

object(class@anonymous)#1 (1) {
  ["Command line code0x104c5b612":"class@anonymous":private]=>
  int(10)
}

لن يتيح تضمين صنف مجهول ضمن صنف آخر الوصول إلى التوابع والخصائص من نوع private أو protected الخاصة بالصنف الخارجي. لغرض استخدام الخصائص أو التوابع من نوع protected الخاصة بالصنف الخارجي، يمكن للصنف المجهول توسيع الصنف الخارجي. ولاستخدام الخصائص من نوع private الخاصة بالصنف الخارجي في الصنف المجهول، يجب أن يكون تمرير الخصائص عبر التابع الباني.

<?php

class Outer
{
    private $prop = 1;
    protected $prop2 = 2;

    protected function func1()
    {
        return 3;
    }

    public function func2()
    {
        return new class($this->prop) extends Outer {
            private $prop3;

            public function __construct($prop)
            {
                $this->prop3 = $prop;
            }

            public function func3()
            {
                return $this->prop2 + $this->prop3 + $this->func1();
            }
        };
    }
}

echo (new Outer)->func2()->func3();
?>

تعطي الشيفرة السابقة النتيجة التالية:

6

جميع الكائنات المُنشأة من الصنف المجهول ذاته هي نسخ من ذلك الصنف.

<?php
function anonymous_class()
{
    return new class {};
}

if (get_class(anonymous_class()) === get_class(anonymous_class())) {
    echo 'same class';
} else {
    echo 'different class';
}
?>

تعطي الشيفرة السابقة النتائج التالية:

same class

ملاحظة: لاحظ أنّ محرّك اللغة يسند اسمًا للأصناف المجهولة كما هو موضّح في المثال التالي. يعدّ هذا الاسم من تفاصيل التنفيذ ولا يجدر الاعتماد عليه إطلاقًا.

<?php
echo get_class(new class {});
?>

تعطي الشيفرة السابقة مخرجات مشابهة لما يلي:

class@anonymous/in/oNi1A0x7f8636ad2021

مصادر