عوامل الأنواع في PHP
تستخدم instanceof
لتحديد ما إذا كان المتغير كائنًا مهيّئًا من صنف معين:
المثال 1: استخدام instanceof
مع الأصناف
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
يعطي المثال السابق المخرجات التالية:
bool(true)
bool(false)
يمكن استخدام instanceof
كذلك لتحديد ما إذا كان المتغير كائنًا مهيّئًا من صنف موروث من صنف آخر:
المثال 2: استخدام instanceof
مع الأصناف الموروثة
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
يعطي المثال السابق المخرجات التالية:
bool(true)
bool(true)
يمكن استخدام عامل النفي للتأكد من أن الكائن ليس مهيّئًا من صنف ما:
المثال 3: استخدام instanceof
للتأكد من كون الكائن مهيّئًا من صنف أو لا
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
تعطي الشيفرة السابقة المخرجات التالية:
bool(true)
وأخيرًا، يمكن استخدام instanceof
أيضًا لتحديد ما إذا كان المتغير كائنًا مهيّئًا من صنف يستخدم واجهة معينة:
المثال 4: استخدام instanceof
مع الأصناف
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
تعطي الشيفرة السابقة المخرجات التالية:
bool(true)
bool(true)
عادة ما تستخدم instanceof
مع أسماء الأصناف، ولكن يمكن استخدامها مع الكائنات الأخرى أو مع السلاسل النصية:
المثال 5: استخدام instanceof
مع متغيرات أخرى
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>
يعطي المثال السابق المخرجات التالية:
bool(true)
bool(true)
bool(false)
لا ترمي instanceof
أي خطأ في حال لم يكن المتغير المفحوص كائنًا، بل تعيد FALSE
فقط. ولكن لا يمكن استخدام الثوابت.
المثال 6: استخدام instanceof
لاختبار المتغيرات الأخرى
<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass);
// $a عدد صحيح
var_dump($b instanceof stdClass);
// $b من نوع NULL
var_dump($c instanceof stdClass);
// $c مورد
var_dump(FALSE instanceof stdClass);
?>
تعطي الشيفرة السابقة المخرجات التالية:
bool(false)
bool(false)
bool(false)
PHP Fatal error: instanceof expects an object instance, constant given
هناك بعض الأمور التي يجب الانتباه إليها عند استخدام instanceof
. قبل الإصدار 5.1.0 من PHP تستدعي instanceof
الدالة __autoload()
إن كان اسم الصنف غير موجودًا. إضافة إلى ذلك، يحدث خطأ من النوع fatal error في حال عدم تحميل الصنف. يمكن تجاوز هذا الأمر باستخدام مرجع الصنف الديناميكي، أو سلسلة نصية تتضمن اسم الصنف:
المثال 7: تجنب البحث عن اسم الصنف والأخطاء المميتة عند استخدام instanceof
في PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d);
// لن يحدث خطأ مميت هنا
?>
تعطي الشيفرة السابقة المخرجات التالية:
bool(false)
ظهر العامل instanceof
في الإصدار 5 من PHP، وقبل هذا الإصدار استُخدمت الدالة is_a()
ولكنّها الآن أصبحت مهملة منذ ذلك الحين. لم تعد الدالة is_a()
مهملة منذ الإصدار 5.3.0 من PHP.
راجع أيضًا الدوال get_class()
و is_a()
.