التوابع البانية والهادمة في PHP

من موسوعة حسوب
< PHP(بالتحويل من PHP/OOP/decon)
اذهب إلى التنقل اذهب إلى البحث

التابع الباني Constructor

void __construct ([ mixed $args = "" [, $... ]] )

تتيح لغة PHP للمطورين التصريح عن تابع بانٍ في الأصناف. كل صنف يمتلك تابعًا بانيًا يُستدعى مع كل كائن جديد يُنشأ من ذلك الصنف؛ لهذا يعد هذا التابع ملائمًا لعمليات التهيئة التي قد يحتاج لها الكائن قبل استخدامه.

ملاحظة: لا يُستدعى التابع الباني الأب ضمنيًا عندما يعرّف الصنف الابن تابعه الخاص، ولاستدعاء التابع الباني الأب يمكن استخدام الصيغة parent::__construct()‎ ضمن التابع الباني الابن. أما في حال لم يعرّف الصنف الابن تابعًا بانيًا فإنّه سيرث التابع الباني الأب كما هو حال التوابع الاعتيادية الأخرى (إلا إذا كان التصريح عن التابع الباني في الصنف الأب من النوع private).

المثال 1: استخدام التوابع البانية الموحدة

<?php
class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       print "In SubClass constructor\n";
   }
}

class OtherSubClass extends BaseClass {
    // inherits BaseClass's constructor
}

// In BaseClass constructor
$obj = new BaseClass();

// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();

// In BaseClass constructor
$obj = new OtherSubClass();
?>

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

تحذير: أصبحت الصيغة القديمة للدوال البانية مهملة في الإصدار 7.0 من اللغة، وستُحذف في الإصدارات المستقبلية؛ ويجب استخدام الدالة ‎__construct()‎ دائمًا.

على خلاف بقية التوابع فإن اللغة لن تطلق خطأً من المستوى E_STRICT عند التجاوز على ‎__construct()‎ بمعاملات تختلف عن المعاملات التي تمتلكها دالة ‎__construct()‎ الأب.

منذ الإصدار 5.3.3، لن تتعامل اللغة مع التوابع التي تحمل نفس اسم العنصر الأخير في صنف موجود ضمن مجال الأسماء كدوال بانية. لن يؤثّر هذا التعديل على الأصناف غير الموجودة في مجال الأسماء.

المثال 2: التوابع البانية في الأصناف غير الموجودة في مجال الأسماء

<?php
namespace Foo;
class Bar {
    public function Bar() {
        // ستعامل معاملة تابع بانٍ في الإصدارات 5.3.0-5.3.2
        // ستعامل معاملة تابع اعتيادي في الإصدار 5.3.3
    }
}
?>

التابع الهادم Destructor

void __destruct ( void )

تقدّم PHP 5 مفهوم الدوال الهادمة وهو مفهوم شائع في لغات البرمجة كائنية التوجّه مثل C++‎. تُستدعى الدالة الهادمة عندما لا يكون هناك أي مرجع لكائن معين.

المثال 3: مثال على الدالة الهادمة

<?php
class MyDestructableClass {
   function __construct() {
       print "In constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
?>

لا تستدعي اللغة التوابع الهادمة ضمنيًا - كما هو الحال مع التوابع البانية -، ولاستدعاء التابع الهادم الأب، يجب استخدام الصيغة parent::__destruct()‎ داخل التابع الهادم. وإذا لم يتضمّن الصنف الابن تابعًا هادمًا فإنه - وكما هو الحال مع التوابع البانية - فسيرث التابع الهادم من الصنف الأب.

يُستدعى التابع الهادم في جميع الأحوال حتى لو استخدمت الدالة exit()‎ لإيقاف تنفيذ الشيفرة. أما استدعاء الدالة exit()‎ في التابع الهادم سيؤدي إلى منع تنفيذ عملية الإغلاق الاعتيادية.

ملاحظة: تمتلك التوابع البانية المُستدعاة أثناء عملية إيقاف تشغيل الشيفرة ترويسات HTTP مرسلة بالفعل. يمكن أن يكون المجلد العامل في شيفرة طور إيقاف التشغيل مختلفًا في بعض واجهات المخدم البرمجية SAPIs (مثل Apache).

ملاحظة: ستؤدي محاولة رمي استثناء من التابع الباني (المستدعى في وقت إنهاء الشيفرة) إلى حدوث خطأ من نوع fatal.

مصادر