Forum und email

בנאים

Caution

ב PHP 3 ו PHP 4 לפונקציות הבנאיות מתנהגות בצורה שונה. הסמנטיקה של PHP 4 עדיפה בהרבה.

בנאים הם פונקציות במחלקה שמופעלים אוטומטית כשיוצרים מופע חדש של המחלקה (בעת יצירת אובייקט חדש) תוך שימוש במילה new. ב PHP 3, פונקציות מוגדרות כבנאיות כשהן נקראות בשם הזהה לשם המחלקה. ב PHP 4, פונקציות משמשות כבנאיות, כשהן בעלות אותו שם של מחלקה שהן מוגדרות בתוכן - ההבדל הוא לכאורה קטן, אבל קריטי (ראה למטה).

// עובד ב PHP 3 וגם ב PHP 4.
class Auto_Cart extends Cart
{
    function Auto_Cart()
    {
        $this->add_item ("10", 1);
    }
}

בודגמא הוגדרה מחלקה Auto_Cart שהיא Cart ובנוסף לה בנאי שמאתחל את העגלה עם ריט אחד של מוצר שמספרו "10" בכל פעם שיוצרים מופע חדש של Auto_Cart בעזרת "new". הפנקציה הבנאית יכולה לקחת ארגומנטים שהם אופציונליים, מה שגורם להם להיות שימושיים במיוחד. על מנת שאפשר יהיה להשתמש בפונקציה בלי פרמטרים, כל הפרמטרים שמועברים לבנאי צריכם להקבע אופציונלית על ידי אספקת ערכי ברירת מחדל.

// עובד גם ב  PHP 3 וגם ב PHP 4.
class Constructor_Cart extends Cart
{
    function Constructor_Cart($item = "10", $num = 1)
    {
        $this->add_item ($item, $num);
    }
}
 
// Shop the same old boring stuff.
 
$default_cart = new Constructor_Cart;
 
// Shop for real...
 
$different_cart = new Constructor_Cart("20", 17);
Caution

ב PHP 3, למחלקות ובנאים נגזרים יש כמה מגבלות. הדוגמא הבאה צריכה להקרא בזהירות על מנת שההגבלות יהיו מובנות.

class A
{
    function A()
    {
      echo "I am the constructor of A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "I am a regular function.<br>\n";
    }
}

// no constructor is being called in PHP 3.
$b = new B;

ב PHP 3, שום פונקציה בנאית לא נקרא בדוגמא הנ"ל. החוק ב PHP 3 הוא: 'הבנאי A הוא הפונקציה של אותו שם של המחלקה.'. השם של המחלקה הוא B, ואין שום פונקציה שנקראת B() במחלקה B. לכן כלום לא קורה.

עניין זהב תוקן ב PHP 4 על ידי הכללת חוק חדש: אם למחלקה אין פונקציה בנאית, הפונקציה בנאית של מחלקת הבסיס נקראת, אם היא קיימת. בדוגמא מעל, ב PHP4 בעת יצירת האוייבקט יודפס הפלט: 'I am the constructor of A.<br>'.

class A
{
    function A()
    {
        echo "I am the constructor of A.<br>\n";
    }

    function B()
    {
        echo "I am a regular function named B in class A.<br>\n";
        echo "I am not a constructor in A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "I am a regular function.<br>\n";
    }
}

// This will call B() as a constructor.
$b = new B;

ב PHP 3, הפונקציה B() שבמחלקה A לפתע תהפוך לבנאית במחלקה B, למרות שלא לזה "התכוון המשורר". החוק ב PHP 3 הוא: 'הבנאי A היא הפונקציה בעלת אותו שם של המחלקה.'.ל PHP 3 לא איכפת אם הפונקציה הוגדרה במחלקה B, או הם היא נגזרה ממחלקה A .

גם עניין זה תוקן ב PHP 4 על ידי יצירת החוק הבא: 'הפונקציה הנבאית A היא פונקציה בעלת אות שם של המחלקה שהיא מוגדרת בתוכה. 'לכן ב PHP 4, המחלקה B שאין לה את הבנאית של עצמה תשתמש בפונקציה הבנאית של מחלקת הבסיס, ולפיכך יודפס על המסך 'I am the constructor of A.<br>'.

Caution

לא PHP 3 ולא PHP 4 קוראים לבנאי של מחלקת הבסיס אוטומטית מבנאי של מחלקה נגזרת. זה באחריות המשתמש לקורא לפונקציה הבנאית של מחלקת הבסיס במקרה כזה.

Note: אין "פונקציה הורסת" (destructors) ב PHP 3 או PHP 4. אתה יכול להשתמש ב register_shutdown_function() במקום זאת לדמות את רוב האספקטים של "פונקציה הורסת" (ההפיך מבנאית).

"פונקציה הורסת" היא פונקציה שנקראת אוטמטית כאשר "משמידים" אובייקט, אם על ידי שימוש ב unset() ואם פשוט על ידי יציאה מחוץ לתחום של האובייקט. כמו שנאמר, אין פונקציות מסוג זה ב PHP.