الفرق بين المراجعتين ل"PHP/anonymous classes"
ط (نقل عبد اللطيف ايمش صفحة PHP/OOP/anonymous إلى PHP/anonymous classes: إعادة هيكلة التوثيق) |
رؤيا-بنعطية (نقاش | مساهمات) (تعديلات طفيفة) |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الأصناف المجهولة في PHP}}</noinclude> | <noinclude>{{DISPLAYTITLE:الأصناف المجهولة في PHP}}</noinclude> | ||
− | + | أُضيف دعم الأصناف المجهولة إلى الإصدار السابع من PHP، وهي مفيدة عند الحاجة إلى إنشاء نسخة واحدة بسيطة من الصنف. | |
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
سطر 27: | سطر 27: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | يمكن للأصناف المجهولة تمرير المعاملات إلى توابعها البانية وتوسيع أصناف أخرى وتطبيق واجهات واستخدام السمات كما هو الحال | + | يمكن للأصناف المجهولة تمرير المعاملات إلى توابعها البانية وتوسيع أصناف أخرى وتطبيق واجهات واستخدام السمات كما هو الحال مع الأصناف الاعتيادية. |
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
سطر 59: | سطر 59: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | لن يتيح تضمين صنف مجهول ضمن صنف آخر الوصول إلى التوابع والخصائص من نوع private أو protected الخاصة بالصنف | + | لن يتيح تضمين صنف مجهول ضمن صنف آخر الوصول إلى التوابع والخصائص من نوع private أو protected الخاصة بالصنف الخارجي. لغرض استخدام الخصائص أو التوابع من نوع protected الخاصة بالصنف الخارجي، يمكن للصنف المجهول توسيع الصنف الخارجي. ولاستخدام الخصائص من نوع private الخاصة بالصنف الخارجي في الصنف المجهول، يجب أن يكون تمرير الخصائص عبر التابع الباني. |
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
المراجعة الحالية بتاريخ 13:34، 2 يونيو 2018
أُضيف دعم الأصناف المجهولة إلى الإصدار السابع من 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