دوال التعامل مع الكائنات والأصناف في PHP

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

تسمح لك هذه الدوال بالحصول على معلومات حول الأصناف ونسخ الكائنات. إذ تستطيع الحصول على اسم الصنف الذي ينتمي إليه الكائن. بالإضافة إلى خصائص أعضائه والدوال التابعة له، لا يُمَكّنك استخدام هذه الدوال فقط من اكتشاف عضوية كائن في الصنف، ولكن أيضًا يمكّنك من اكتشاف أصله (أي ما هو الصنف الذي يرثه صنف الكائن).

الرجاء الاطلاع على قسم البرمجة كائنية التوجه (OOP) في الموسوعة للحصول على شرح مفصّل لكيفيّة تنفيذ واستخدام الصفوف والكائنات في PHP.

أمثلة

نُعرّف في هذا المثال بدايةً صنف أساس (أب) كما نُعرّف صنفًا آخر يرث منه. يصف الصنف الأساس الخضروات العامة، بغض النظر عّما إذا كانت قابلة للأكل أم لا وما هو لونها. يضيف الصف الفرعي Spinach دالة تابعة للصنف لطهيها وآخرى لمعرفة ما إذا كانت مطهية.

المثال 1: classes.inc

<?php

 //الصنف الأساس مع خصائص العضو والدوال التابعة للصنف
class Vegetable {

   var $edible;
   var $color;

   function __construct($edible, $color="green")
   {
       $this->edible = $edible;
       $this->color = $color;
   }

   function is_edible()
   {
       return $this->edible;
   }

   function what_color()
   {
       return $this->color;
   }

} 
//Vegetable نهاية الصنف  

// وراثة الصنف الأساس
class Spinach extends Vegetable {

   var $cooked = false;

   function __construct()
   {
       parent::__construct(true, "green");
   }

   function cook_it()
   {
       $this->cooked = true;
   }

   function is_cooked()
   {
       return $this->cooked;
   }

}
//Spinach نهاية صنف
?>

ثم أنشأنا كائنين اثنين من هذا الصنف وأظهرنا معلومات عنهما. متضمنةً الصنف الأب لهما. وعرّفنا أيضًا بعض الدوال المفيدة، التي يكون غرضها الرئيسي هو تحسين طباعة المتغيرات. المثال 2: test_script.php

<?php

include "classes.inc";

 دوال مفيدة//

function print_vars($obj)
{
foreach (get_object_vars($obj) as $prop => $val) {
    echo "\t$prop = $val\n";
}
}

function print_methods($obj)
{
$arr = get_class_methods(get_class($obj));
foreach ($arr as $method) {
    echo "\tfunction $method()\n";
}
}

function class_parentage($obj, $class)
{
if (is_subclass_of($GLOBALS[$obj], $class)) {
    echo "Object $obj belongs to class " . get_class($GLOBALS[$obj]);
    echo ", a subclass of $class\n";
} else {
    echo "Object $obj does not belong to a subclass of $class\n";
}
}

//إنشاء كائنين

$veggie = new Vegetable(true, "blue");
$leafy = new Spinach();

//طباعة معلومات عن الكائنات
echo "veggie: CLASS " . get_class($veggie) . "\n";
echo "leafy: CLASS " . get_class($leafy);
echo ", PARENT " . get_parent_class($leafy) . "\n";

//veggie إظهار خصائص
echo "\nveggie: Properties\n";
print_vars($veggie);

//leafy والدوال التابعة للكائن
echo "\nleafy: Methods\n";
print_methods($leafy);

echo "\nParentage:\n";
class_parentage("leafy", "Spinach");
class_parentage("leafy", "Vegetable");
?>

شيء مهم لملاحظته في المثال السابق وهو  أن الكائن ‎$leafy هو نسخة للصنف Spinach والذي هو صنف فرعي من الصنف Vegetable، وبالتالي فإن الجزء الأخير من السكربت في الأعلى سيعطي الناتج التالي:

  [...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach, a subclass of Vegetable

class_alias()‎

تُنشئ الدالّة class_alias()‎‎ اسمًا مستعارًا للصنف.

class_exists()‎

تتحقق الدالّة class_exists()‎‎‎ من أنّ الصنف الممرّر مُعرّف.

get_called_class()‎

تُعيد الدالّة get_called_class()‎ اسم صنف الروابط الساكنة المتأخرة (Late Static Binding).

get_class_methods()‎

تُعيد الدالّة get_class_methods()‎ أسماء الدوال التابعة للصنف.

get_class_vars()‎

تُعيد الدالّة get_class_vars()‎‎‎‎ الخصائص الافتراضية للصنف.

get_class()‎

تُعيد الدالة  get_class()‎‎‎‎‎‎‎‎ اسم الصنف لكائن object.

get_declared_classes()‎

تُعيد الدالة get_declared_classes()‎ مصفوفةً فيها أسماء الأصناف المُصرّح عنها.

get_declared_interfaces()‎

تُعيد الدالة get_declared_interfaces()‎‎ مصفوفة  بكل الواجهات (interfaces) المُصرّح عنها.

get_declared_traits()‎

تُعيد الدالة get_declared_traits()‎‎ مصفوفة بكل السمات (traits) المُصرّح عنها.

get_object_vars()‎

تحصل الدالة get_object_vars()‎‎‎ على خصائص (properties) الكائن المُعطى.

get_parent_class()‎

تحصل الدالة get_parent_class()‎‎‎‎ على اسم الصنف الأب لكائن أو لصنف.

interface_exists()‎

تتحقق الدالة interface_exists()‎‎‎‎‎ فيما إذا كانت الواجهة (interface) مُعرّفة.

is_a()‎

تتحقق الدالة is_a()‎‎‎‎‎‎ فيما إذا كان الكائن من صنفٍ معيّن أو كان ذاك الصنف واحدًا من الأصناف الآباء له.

is_subclass_of()‎

تتحقق الدالة is_subclass_of()‎‎‎‎‎‎‎ فيما إذا كان يملك الكائن صنفًا ما كواحد من الأصناف الآباء له أو ينفذه.

method_exists()‎

تتحقق الدالة method_exists()‎‎‎‎‎‎ فيما إذا كانت الدالة التابعة للصنف method_name موجودة.

property_exists()‎

تتحقق الدالة  property_exists()‎‎‎‎‎‎‎ فيما إذا كان لدى الكائن أو الصنف الخاصيّة property.

trait_exists()‎

تتحقق الدالة trait_exists()‎‎‎‎‎‎‎‎ فيما إذا كانت السمة (trait) موجودةً.

مصادر