عوامل الأنواع في PHP

من موسوعة حسوب
< PHP
مراجعة 03:47، 4 أبريل 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - 'PHP\/([^|-]*)-([^|-]*)' ب'PHP/$1_$2')

تستخدم 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()‎.

مصادر