الأفعال السحرية في البرمجة الكائنية Magic Methods in OOP
لتسهيل التعامل مع الكائنات 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 قبل اي فعل آخر حتى بدون استدعائه عن طريق الكائن مما يتيح لك مرونة التعديل او إعداد بعض الخصائص أو حتى تنفيذ بعض الأفعال مباشرة قبل البدء باستخدام الكائن
لإستدعاء دالة (فعل 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 آخر الملف والسبب أن 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 />";
وعند زيارة الملف من المتصفح سيكون الناتج كالتالي
التحويل إلى نص 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 />";
فإن الناتج سيكون كالتالي
لتجنب هذا الخطأ ومنع حدوثه نقوم بتعريف الفعل السحري 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 />";
عند زيارة الملف من المتصفح فإن الناتج سيكون كالتالي
تنبيه: عند إستخدام الفعل السحري 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
التعليقات (0)
عرض المزيد.. جديد مقالاتي
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !