Forum und email

מחלקות ואובייקטים

Table of Contents

מחלקות

מחלקה היא אוסף של משתנים ופונקציות שעובדות עם משתנים אלו. מחלקה מוגדרת תוך שימוש בתחביר הבא:

<?php
class Cart
{
    var 
$items;  // הגדרת משתנה של המחלקה בשם $items 
   
    // Add $num articles of $artnr to the cart
 
    
function add_item ($artnr$num)
    {
        
$this->items[$artnr] += $num;
    }
   
    
// Take $num articles of $artnr out of the cart
 
    
function remove_item ($artnr$num)
    {
        if (
$this->items[$artnr] > $num) {
            
$this->items[$artnr] -= $num;
            return 
true;
        } else {
            return 
false;
        }   
    }
}
?>

בדוגמא הנ"ל, הוגדרה מחלקה ששמה Cart, שמורכבת ממערך המשוייך לפריטים שבתוך בסל (Cart), ומשני פונקציות להוספה (add) ולהסרה (remove) של פריטים מתוך העגלה.

Caution

המדריך הבא מתאים ל PHP4 !.

המילה stdClass היא מילה שמורה הנמצאת בשימוש פנימי על ידי ZEND. לכן, אין להשתמש במילה stdClass ב PHP.

שם הפונקציה __sleep ושם הפונקציה __wakeup בעלות שימוש מיוחד ב - php. אתב לא יכול להשתמש בשם הזהה לאחת משתי הפונקציות הנ"ל במחלקה כלשהי אלא אם אתה רוצה להשתמש בהן לאפשרות המיוחדת (שתפורט בהמשך) שלה הן נועדו. ראה בהמשך המדריך למידע נוסף.

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

Note: ב PHP 4, איתחול משתני מחלקה שהוגדרו בעזרת var אפשרי רק עם קבועים. כדי לאתחל משתנים, שלא על ידי ערכי קבועים, אתה צריך להשתמש בפונקציה שנקראת אוטומטית על ידי PHP כאשר נוצר אובייקט חדש של הפונקציה. פונקציה כזאת נקראת "פונקציה בנאית" (constructor) (ראה למטה).

<?php
/* במחלקה הבאה, תגרור הודעת שגיאה בגלל איתחול משתנים שגוי ! */
class Cart
{
    var 
$todays_date date("Y-m-d");
    var 
$name $firstname;
    var 
$owner 'Fred ' 'Jones';
    var 
$items = array("VCR""TV");
}

/* ככה זה אמור להעשות: */
class Cart
{
    var 
$todays_date;
    var 
$name;
    var 
$owner;
    var 
$items;

    function 
Cart() // הבנאי של המחלקה
    
{
        
$this->todays_date date("Y-m-d");
        
$this->name $GLOBALS['firstname'];
        
/* etc. . . */
    
}
}

מחלקות הן תבניות, כלומר, הן הכנה ליצירת משתנים אמיתיים (האובייקטים) יוצרים את המשתנים מהסוג המבוקש תוך שימוש באופרטור new.

<?php
$cart 
= new Cart;
$cart->add_item("10"1);

$another_cart = new Cart;
$another_cart->add_item("0815"3);

הדוגמא הנ"ל יצרה את האובייקטים $cart ו $another_cart, שניהם אובייקטים שנוצרו מהמחלקה Cart. הפונקציה add_item() של האובייקט - $cart נקראת על מנת להוסיף פריט אחד של חפץ מס' 10 לתוך העגלה. 3 פריטים חפץ מס' 0815 נוספו לאובייקט $another_cart.

גם ל $cart וגם ל $another_cart, יש את הפונקציות add_item(), remove_item() ומשתנה של פריטים ($items) . אלו הם פונקציות ומשתנים נפרדים. אפשר לחשוב על אובייקטים כדומים לספריות וקבצים במערכת קבצים. בתוך מערכת קבצים יכולים להיות לך שני קבצי README.TXT שונים לחלוטין, כל עוד הם יימצאו בספריה אחרת. ממש כמו במערכות קבצים, כשצריך להלקיד את המסלול המלא על מנת להפעיל קובץ כלשהו, אם לא נמצאים בספריה שלו, יש צורך לתת את השם המלא של הפונקציה אותה רוצים להפיל, במונחים של php: "רמת הגובה" של האובייקט נקבע בעזרת שמות שהוגדרו, ומהפריד בין שמות אלו ->. לכן, המילים $cart->items ו $another_cart->items הן שמות של שתי משתנים אחרים. יש לשים לב לעובדה שהמשתנה נקרא $cart->items, ולא $cart->$items, וזאת בשל, שלשם משתנה ב PHP יש רק סימן $ אחד.

// correct, single $
$cart->items = array("10" => 1); 


// שגוי, בגלל ש $cart->$items הופך להיות $cart->""
$cart->$items = array("10" => 1);


//נכון, אבל עלול להיות גם משהו שלא אליו התכוונו
//$cart->$myvar הפך להיות $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);

עם הגדרת המחלקה, אין אפשרות לדעת אילו שמות אובייקטים ייוצרו בתוכנית לאותה מחלקה: בזמן שהמחלקה Cart נכתבה, לא היה ידוע שייוצר האובייקט $cart או האובייקט $another_cart מאוחר יותר. לכן, בלתי אפשרי לכתוב $cart->items בתוך המחלקה Cart עצמה. במקום זאת, כדי שאפשר יהיה לפנות בתוך לתוך הפונקציות והמשתנים של האוייקט בתוך המחלקה עצמה, אפשר להשתמש ב בפסאודו - משתנה (משתנה מדומה) $this שיכול להחשב כ 'של עצמי' או 'אובייקט נוכחי'. לפיכך, '$this->items[$artnr] += $num' יכול להקרא כ 'הוסף $num למונה $artnr של מערל החפצים של עצמי' או 'הוסף $num למונה $artnr של מערך החפצים שנמצא בתוך האובייקט הנוכחי'.