اذهب إلى المحتوى

السؤال

نشر

لدي واجهة تسمى IUser وأقوم بإستعمال هذه الواجهة في بعض الأصناف classes على النحو التالي:

interface IUser {
	// ...
}

class MyClass implements IUser {
	// ...
}

الآن إذا قمت بعمل كائن Object من الصنف MyClass، فهل يمكنني التحقق من أن هذا الكائن يقوم بعمل implements للواجهة IUser؟
هل توجد دالة أو طريقة نقوم بهذا الأمر؟

Recommended Posts

  • 1
نشر

تدعم لغة PHP المعامل instanceof والذي يسمح لك بالتأكد من أن كائن معين عبارة عن مثيل instance من صنف معين أو يستخدم واجهة معينة interface، ويمكن إستخدامه كما يلي:

<?php

interface IUser {
	// ...
}

class MyClass implements IUser {
	// ...
}

$obj = new MyClass();

if ($obj instanceof IUser) {
    echo "obj implements IUser\n";
}

if ($obj instanceof MyClass) {
    echo "obj is instance of MyClass";
}

/*
Output: 
    obj implements IUser
    obj is instance of MyClass
*/

أيضًا يمكنك إستخدام الدالة class_implements والتي تسمح بمعرفة الواجهات التي يستعملها الصنف:

$obj = new MyClass();
print_r(class_implements('MyClass'));

/*
Output:
	Array
    (
        [IUser] => IUser
    )
*/

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

$obj = new MyClass();
$interfaces = class_implements('MyClass');

if (isset($interfaces['IUser'])) {
    echo "obj implements IUser";
}

مع العلم أن الطريقة الأولى (المعامل instanceof) أسرع في الأداء من الطريقة الثانية (الدالة class_implements).

  • 1
نشر

يمكنك فعل ذلك من خلال العبارة instanceof وكمثال :

<?php
class MyClass {}
class AnotherClass extends MyClass{}
$obj = new AnotherClass();

// سوف يحقق الشرط
if($obj instanceof AnotherClass) {
  echo "The object is AnotherClass";
}

// وكذلك يحقق الشرط
if($obj instanceof MyClass) {
  echo "The object is MyClass<br>";
}
?>

اقرأ أيضاً فيما يتعلق بالـ instanceof :

https://wiki.hsoub.com/PHP/type_operators

 

  • 0
نشر

بجانب ما اقترحه المدربون يمكنك استعمال الواجهة البرمجية لـ ReflectionClass في PHP عن طريق التابع implementsInterface:

<?php

interface OtherInterface { /**/ }
interface IUser { /**/ }

class MyClass implements IUser { /**/ }

$class = new ReflectionClass('MyClass');
echo $class->implementsInterface('IUser'); // true
echo $class->implementsInterface('OtherInterface'); // false

مثلما يمكنك عمل نفس الشيء عن طريق الوظيفة is_subclass_of في حالة الحاجة الى التحقق من ما ان كان كائن من ما عن صنف ما يطبق واجهة: 

<?php

interface OtherInterface { /**/ }
interface IUser { /**/ }

class MyClass implements IUser { /**/ }

$class = new MyClass();

echo is_subclass_of($class, 'IUser'); // true
echo is_subclass_of($class ,'OtherInterface'); // false

للاستزادة: دوال التعامل مع الكائنات والأصناف في PHP

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...