פרק 13. Classes and Objects

תוכן העניינים:
מחלקות
הורשות
בנאים
::
הורה
"אובייקטים בהמשכים" - אובייקטים ב session
"פונקציות הקסם": __sleep ו __wakeup
ייחוס שנכתב לבנ××™×

מחלקות

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

 
?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 ) של פריטים מתוך העגלה .

זהירות

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

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

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

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

הערה : ב 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 .

הדוגמא הנ" ל יצרה את האובייקטים $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 של מערך החפצים שנמצא בתוך האובייקט הנוכחי ' .