الأفعال السحرية في البرمجة الكائنية Magic Methods in OOP

Ali Majrashiمنذ 8 سنوات

لتسهيل التعامل مع الكائنات Objects فإن PHP توفر عدد من الأفعال السحرية Magic Methods وتسمى أيضا بالأفعال المميزة يتم تنفيذ محتواها عند وقوع حدث معين داخل الكائن Object مما يسمح للمبرمج أن ينفذ العديد من المهام بكل سهولة ويسر 

إستخدام Constructors و Destructors

عندما تقوم بنسخ كائن جديد و حفظه بمتغير لبدء التعامل معه ترغب أحيانا بتعريف بعض الخصائص Properties أو إستدعاء بعض الأفعال Methods المعرفة داخل الكلاس من البداية قبل البدء بإستخدام الكائن Object لتحقيق هذا نستطيع إستخدام الفعل السحري magic method 


__construct()

حيث انه يتم إستدعاء هذا الفعل Method مباشرة عندما تقوم بإنشاء أي كائن Object جديد 

ملاحظة: جميع الأفعال السحرية magic methods هي اسماء ثابتة غير متغيرة وتبدأ تسميتها _ _ بخطين سفليين متصليين ببعض (underscore) 

لتوضيح عمل هذا الفعل السحري سنقوم بإنشاء ملف PHP جديد وحفظه داخل أي مجلد داخل السيرفر المحلي بجهازك وبعدها نقوم بتعريف كلاس جديد داخل هذا الملف ونستخدم هذا الفعل لطباعة رسالة بالمتصفح عندما يتم عمل نسخه لكائن جديد وتخزينه داخل متغير 

لمعرفة طريقة تعريف كلاس جديد و إنشاء كائن ننصحك بقرائة هذا المقال البرمجة الكائنية PHP OOP

لتسهيل الأمثلة سنكمل على نفس نمط أمثلة المقال السابق ليصبح محتوى الملف كالتالي 


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function __construct()
	  {
	      echo 'The class was initiated successfully<br />';
	  }

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

// Create a new object
$object = new SimpleClass;

echo $object->getProperty(); // Get the property value and print it

عند تشغيل هذا الملف من المتصفح فإن الناتج سيكون كالتالي 

construct.png

لاحظ أنه تم تنفيذ محتوى الفعل السحري construct قبل اي فعل آخر حتى بدون استدعائه عن طريق الكائن مما يتيح لك مرونة التعديل او إعداد بعض الخصائص أو حتى تنفيذ بعض الأفعال مباشرة قبل البدء باستخدام الكائن

لإستدعاء دالة (فعل Method) عندما يتم إنهاء أو تدمير عمل الكائن فإننا نستخدم الفعل السحري Magic Method 


__destruct()

فائدة هذا الفعل السحري تبرز عند الرغبة بتنفيذ عمليات التنظيف للكلاس class cleanup أقرب مثال عندما ترغب بإغلاق الإتصال بقاعدة البيانات

الآن سنقوم بتعريف هذا الفعل السحري داخل الكلاس السابق ونطبع رسالة عند تدمير عمل الكائن ليصبح محتوى الملف كالتالي


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function __construct()
	  {
	      echo 'The class was initiated successfully<br />';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally.<br />';
	  }

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

// Create a new object
$object = new SimpleClass;

echo $object->getProperty(); // Get the property value and print it

// print a message at the end of the file
echo "End of file.<br />";

وعند زيارة الملف من المتصفح سيكون الناتج كالتالي 

destruct.png

لاحظ أنه تم تنفيذ محتوى الفعل السحري destruct آخر الملف والسبب أن PHP عندما تعالج هذا الملف و تصل لنهايته تقوم مباشرة بتحرير جميع المصادر ومن ضمنها إنهاء عمل أي كائن معرف 

"When the end of a file is reached, PHP automatically releases all resources."

ولكن إذا كنت ترغب بتفعيل عمل الفعل destructor قبل أن تقوم PHP بإنهائه تسطيع تدمير عمل الكائن بإستخدام الدالة

unset()

قم بإضافة الدالة قبل آخر أمر طباعة لعرض الفرق ليصبح محتوى الملف كالتالي


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function __construct()
	  {
	      echo 'The class was initiated successfully<br />';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally.<br />';
	  }

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

// Create a new object
$object = new SimpleClass;

echo $object->getProperty(); // Get the property value and print it

// Destroy the object
unset($object);

// print a message at the end of the file
echo "End of file.<br />";

وعند زيارة الملف من المتصفح سيكون الناتج كالتالي

destruct-2.png

التحويل إلى نص Converting to a String

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


__toString()

بدون تعريف هذا الفعل السحري داخل أي كلاس وعند محاولة طباعة الكائن على هيئة نص فإنه ينتج لدينا خطأ fatal error الآن سنقوم بطباعة الكائن باستخدام الدالة echo بدون تعريف الفعل السحري داخل الكلاس 

بعد استخدام الدالة echo فإن محتوى الملف سيكون كالتالي 


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function __construct()
	  {
	      echo 'The class was initiated successfully<br />';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally.<br />';
	  }

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

// Create a new object
$object = new SimpleClass;

// Output the object as a string
echo $object;

// Destroy the object
unset($object);

// print a message at the end of the file
echo "End of file.<br />";

فإن الناتج سيكون كالتالي 

to-string.png

لتجنب هذا الخطأ ومنع حدوثه نقوم بتعريف الفعل السحري toString داخل الكلاس ليصبح محتوى الملف كالتالي 


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function __construct()
	  {
	      echo 'The class was initiated successfully<br />';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally.<br />';
	  }

	public function __toString()
	  {
	      return 'Using the toString method <br />';
	  }

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

// Create a new object
$object = new SimpleClass;

// Output the object as a string
echo $object;

// Destroy the object
unset($object);

// print a message at the end of the file
echo "End of file.<br />";

عند زيارة الملف من المتصفح فإن الناتج سيكون كالتالي 

to-string-2.png

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

اقتباس

Catchable fatal error: Method SimpleClass::__toString() must return a string value in /Applications/MAMP/htdocs/oop/test.php on line 37

الخلاصة 

بإستخدام هذه الأفعال السحرية يضيف مرونة وسلاسة في التعامل مع الكائنات وتنفيذ أوامر محددة عن وقوع حدث معين عند إستخدام الكائن فلو كنت ترغب بتنفيذ أوامر عند بدء نسخ الكائن نستخدم الفعل السحري construct اما لو ترغب بتنفيذ أوامر عن تدمير أو إنهاء عمل الكائن نستخدم الفعل destruct وايضا تسطيع تنفيذ أوامر عند معاملة الكائن على شكل نص وطباعته مباشرة للمتصفح باستخدام الفعل toString كما تدعم PHP العديد من الأفعال السحرية المميزة مثل تنفيذ أوامر عند محاولة طباعة خاصية Property غير معرفة داخل الكلاس بإستخدام الفعل السحري get أو تنفيذ أوامر عند محاولة التغيير على قيمة خاصية غير معرفة بالكلاس باستخدام الفعل السحري set مما يتيح لك تخزين وتعريف الخصائص الغير معرفة داخل الكلاس بكل سهولة وتسطيع التعامل معها عن طريق الفعل السحري get بكل مرونة 

لك حرية استخدام هذه الأفعال السحرية لزيادة مرونة وقوة الكلاسات على حسب احتياجاتك وتسطيع تكييفها لتناسبك بكل يسر وسهولة 

هنا قائمة بكل الأفعال السحرية وروابط شرحها بموقع اللغة PHP 

كلمات دليلية:
1
إعجاب
5597
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !