الفرق بين المراجعتين لصفحة: «PHP/object handling»

من موسوعة حسوب
< PHP
إنشاء الصفحة مع البنية الأساسية لها
 
لا ملخص تعديل
 
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:دوال التعامل مع الكائنات والأصناف في PHP}}</noinclude>
<noinclude>{{DISPLAYTITLE:دوال التعامل مع الكائنات والأصناف في PHP}}</noinclude>
تستعمل هذه الدوال للتعامل مع مختلف العمليات التي يمكن إجراؤها على الكائنات والأصناف في لغة PHP.
تسمح لك هذه الدوال بالحصول على معلومات حول الأصناف ونسخ الكائنات. إذ تستطيع الحصول على اسم الصنف الذي ينتمي إليه الكائن. بالإضافة إلى خصائص أعضائه والدوال التابعة له، لا يُمَكّنك استخدام هذه الدوال فقط من اكتشاف عضوية كائن في الصنف، ولكن أيضًا يمكّنك من اكتشاف أصله (أي ما هو الصنف الذي يرثه صنف الكائن).
 
الرجاء الاطلاع على قسم [[PHP/OOP|البرمجة كائنية التوجه]] (OOP) في الموسوعة للحصول على شرح مفصّل لكيفيّة تنفيذ واستخدام الصفوف والكائنات في PHP.
 
== أمثلة ==
نُعرّف في هذا المثال بدايةً صنف أساس (أب) كما نُعرّف صنفًا آخر يرث منه. يصف الصنف الأساس الخضروات العامة، بغض النظر عّما إذا كانت قابلة للأكل أم لا وما هو لونها. يضيف الصف الفرعي <code>Spinach</code> دالة تابعة للصنف لطهيها وآخرى لمعرفة ما إذا كانت مطهية.
 
المثال 1: <code>classes.inc</code><syntaxhighlight lang="php">
<?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 نهاية صنف
?>
</syntaxhighlight>ثم أنشأنا كائنين اثنين من هذا الصنف وأظهرنا معلومات عنهما. متضمنةً الصنف الأب لهما. وعرّفنا أيضًا بعض الدوال المفيدة، التي يكون غرضها الرئيسي هو تحسين طباعة المتغيرات.
 
المثال 2: <code>test_script.php</code><syntaxhighlight lang="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");
?>
 
</syntaxhighlight>شيء مهم لملاحظته في المثال السابق وهو  أن الكائن <code>‎$leafy</code> هو نسخة للصنف <code>Spinach</code> والذي هو صنف فرعي من الصنف <code>Vegetable</code>، وبالتالي فإن الجزء الأخير من السكربت في الأعلى سيعطي الناتج التالي:<syntaxhighlight lang="text">
  [...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach, a subclass of Vegetable
 
</syntaxhighlight>


== <code>[[PHP/class_alias|class_alias()‎]]</code> ==
== <code>[[PHP/class_alias|class_alias()‎]]</code> ==
تُنشئ الدالّة <code>class_alias()</code>‎‎ اسمًا مستعارًا للصنف.
== <code>[[PHP/class_exists|class_exists()‎]]</code> ==
== <code>[[PHP/class_exists|class_exists()‎]]</code> ==
تتحقق الدالّة <code>class_exists()</code>‎‎‎ من أنّ الصنف الممرّر مُعرّف.
== <code>[[PHP/get_called_class|get_called_class()‎]]</code> ==
== <code>[[PHP/get_called_class|get_called_class()‎]]</code> ==
تُعيد الدالّة <code>get_called_class()‎</code> اسم صنف الروابط الساكنة المتأخرة ([[PHP/late static bindings|Late Static Binding]]).
== <code>[[PHP/get_class_methods|get_class_methods()‎]]</code> ==
== <code>[[PHP/get_class_methods|get_class_methods()‎]]</code> ==
تُعيد الدالّة <code>get_class_methods()</code>‎ أسماء الدوال التابعة للصنف.
== <code>[[PHP/get_class_vars|get_class_vars()‎]]</code> ==
== <code>[[PHP/get_class_vars|get_class_vars()‎]]</code> ==
تُعيد الدالّة <code>get_class_vars()</code>‎‎‎‎ الخصائص الافتراضية للصنف.
== <code>[[PHP/get_class|get_class()‎]]</code> ==
== <code>[[PHP/get_class|get_class()‎]]</code> ==
تُعيد الدالة  <code>get_class()</code>‎‎‎‎‎‎‎‎ اسم الصنف لكائن <code>object</code>.
== <code>[[PHP/get_declared_classes|get_declared_classes()‎]]</code> ==
== <code>[[PHP/get_declared_classes|get_declared_classes()‎]]</code> ==
تُعيد الدالة <code>get_declared_classes()</code>‎ مصفوفةً فيها أسماء الأصناف المُصرّح عنها.
== <code>[[PHP/get_declared_interfaces|get_declared_interfaces()‎]]</code> ==
== <code>[[PHP/get_declared_interfaces|get_declared_interfaces()‎]]</code> ==
تُعيد الدالة <code>get_declared_interfaces()</code>‎‎ مصفوفة  بكل الواجهات (interfaces) المُصرّح عنها.
== <code>[[PHP/get_declared_traits|get_declared_traits()‎]]</code> ==
== <code>[[PHP/get_declared_traits|get_declared_traits()‎]]</code> ==
تُعيد الدالة <code>get_declared_traits()‎‎</code> مصفوفة بكل السمات (traits) المُصرّح عنها.
== <code>[[PHP/get_object_vars|get_object_vars()‎]]</code> ==
== <code>[[PHP/get_object_vars|get_object_vars()‎]]</code> ==
تحصل الدالة <code>get_object_vars()</code>‎‎‎ على خصائص (properties) الكائن المُعطى.
== <code>[[PHP/get_parent_class|get_parent_class()‎]]</code> ==
== <code>[[PHP/get_parent_class|get_parent_class()‎]]</code> ==
تحصل الدالة <code>get_parent_class()</code>‎‎‎‎ على اسم الصنف الأب لكائن أو لصنف.
== <code>[[PHP/interface_exists|interface_exists()‎]]</code> ==
== <code>[[PHP/interface_exists|interface_exists()‎]]</code> ==
تتحقق الدالة <code>interface_exists()</code>‎‎‎‎‎ فيما إذا كانت الواجهة (interface) مُعرّفة.
== <code>[[PHP/is_a|is_a()‎]]</code> ==
== <code>[[PHP/is_a|is_a()‎]]</code> ==
تتحقق الدالة <code>is_a()</code>‎‎‎‎‎‎ فيما إذا كان الكائن من صنفٍ معيّن أو كان ذاك الصنف واحدًا من الأصناف الآباء له.
== <code>[[PHP/is_subclass_of|is_subclass_of()‎]]</code> ==
== <code>[[PHP/is_subclass_of|is_subclass_of()‎]]</code> ==
تتحقق الدالة <code>is_subclass_of()</code>‎‎‎‎‎‎‎ فيما إذا كان يملك الكائن صنفًا ما كواحد من الأصناف الآباء له أو ينفذه.
== <code>[[PHP/method_exists|method_exists()‎]]</code> ==
== <code>[[PHP/method_exists|method_exists()‎]]</code> ==
تتحقق الدالة <code>method_exists()</code>‎‎‎‎‎‎ فيما إذا كانت الدالة التابعة للصنف <code>method_name</code> موجودة.
== <code>[[PHP/property_exists|property_exists()‎]]</code> ==
== <code>[[PHP/property_exists|property_exists()‎]]</code> ==
تتحقق الدالة  <code>property_exists()</code>‎‎‎‎‎‎‎ فيما إذا كان لدى الكائن أو الصنف الخاصيّة <code>property</code>.
== <code>[[PHP/trait_exists|trait_exists()‎]]</code> ==
== <code>[[PHP/trait_exists|trait_exists()‎]]</code> ==
تتحقق الدالة <code>trait_exists()</code>‎‎‎‎‎‎‎‎ فيما إذا كانت السمة (trait) موجودةً.


== مصادر ==
== مصادر ==

المراجعة الحالية بتاريخ 04:54، 16 أبريل 2018

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

الرجاء الاطلاع على قسم البرمجة كائنية التوجه (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) موجودةً.

مصادر