משתנים בתוך מחלקה

קרמיט524

New member
משתנים בתוך מחלקה

משהו שאני תוהה עליו כבר כמה זמן:
מתי מצהירים על משתנים במחלקה, והאם צריך את זה בכלל?

למשל, יש לי פונקציה שמציבה נתונים במשתנה של המחלקה.

function set_myvar ( _DOLLAR_myvar) {
_DOLLAR_this -> myvar = _DOLLAR_myvar;
}


האם ולמה אני צריכה להצהיר על myvar גם במחלקה?

private _DOLLAR_myvar;

אשמח לקבל הסבר על העניין.
בתודה מראש ובברכה,
 

merav955

New member
פרטיות

כשאת מצהירה על המשתנה במחלקה, את למעשה מגדירה מי יכול לראות את המשתנה (באמצעות שימוש ב- public, private, protected, etc.)
 

קרמיט524

New member
הבנתי.


כלומר, אם אני מצהירה על המשתנה רק בהשמה שלו בתוך פונקציה, זה אומר שהוא מוגדר אוטומטית כ-public?
 
אם זה משתנה מחלקה

this->var =
אז כן,
אן זה משתנה מקומי בפונקציה אז זה משתנה מקומי של הפונקציה(בלי הTHIS)
 
זה יעבוד בלי

אבל זה לא תכנון נכון של הקוד.

קודם כל, ניתן להכריז על הVISIBILITY של המשתנה רק כשהוא מוגדר במחלקה( PRIVATE PUBLIC וכו')
את גם יודעת מראש עם אילו משתנים את תעבדי ואת גם מתעדת ורושמת עליהם הערות שם שזה משפר את קריאות והבנת הקוד ומונע באגים עתידיים.
 

קרמיט524

New member
סבבה זה מה שחשבתי. פשוט רציתי להיות

בטוחה שאני לא מפספספת כלום.
תודה!
 

amitayh

New member
ובנוסף זה גם עוזר ל - IDE להבין את הקוד

ולתת השלמות אוטומטיות יותר טובות
 

fat fish

New member
למה כן, ולמה לא...

למה כן
זה יעבוד משתי סיבות:
1. PHP הינה שפה דינמית ומאפשר יצירת משתנים בכל מקום מכל זמן. גם עבור אובייקטים (שימי לב, המשתנה יווצר רק עבור אותו אובייקט)
2. זהו backward compatibility ל-PHP4

למה לא
כשכותבים קוד בפרדיגמת OO, אנחנו צריכים לחשוב מהו אובייקט ומהו מייצג.
אובייקט הינו יישות עם מצב (state) ועם פעולות (method) - המצב של האובייקט מיוצג על ידי המשתנים שלו. ולכן, כאשר משתנה לא מוגדר ומיוצר דינמית, המצב של אובייקטים שונים מאותה מחלקה אינם ברי השוואה, ואין להם באמת חתימה זהה (גם אם "מצב" שונה)

ובכל זאת...
היה ואנו מעוניינים להציב נתונים בצורה דינמית לאובייקט - PHP5 מספקת לנו פונקציות קסומות לטיפול בנתונים שאינם מוגדרים כחלק מהמחלקה. כך תוכלי לטפל בהצבה וקריאה של משתנים "דינמיים" בדרך ייחודית, בלי לפגוע ב"מצב" של האובייקט (קראי אודות Property overloading בשפת PHP)

בהצלחה,
 

קרמיט524

New member
טוב, לא ממש הבנתי כל מה שכתבת אבל:

ב-"למה כן" התכוונת למה כן להגדיר אותם? כלומר - לשם תאימות ל-PHP4 כי PHP4 חייבה להגדיר את המשתנים במחלקה כדי לעבוד איתם? (לא כל כך מכירה OOP ב-PHP4)
הבנתי את העניין של מצב בסעיף "למה לא", אבל לא הבנתי את המסקנה - אם אגדיר את המשתנים מראש, זה למנע ממני להשוות אובייקט אחד לשני?
ואז, אם אני מבינה נכון - המסקנה היא שרצוי בכל מקרה להצהיר על המשתנים מראש, ולטפל במצב האובייקט בעזרת הפונקציות הקסומות?
(הלכתי לקרוא את הקישור ששלחת)
 

amitayh

New member
השורה התחתונה היא שתמיד כן כדאי להצהיר

על ה - properties. במידה ואת צריכה properties דימניים ניתן להשתמש בפונקציות הקסומות (הנה דוגמה: http://pastie.org/4180350 )
 

קרמיט524

New member
הבנתי. אני חושבת.

למה בעצם שיהיה מצב שבו כן אצטרך תכונות-אובייקט דינמיות?
שוב תודה
 

amitayh

New member
ברוב המקרים לא צריך, יש מקרים ספציפיים שזה

כן עוזר (בד"כ עם אובייקטים שמשמשים לאיזה סוג של storage)
 

fat fish

New member
אחת הסיבות...

שבו תזדקקי לאובייקט עם תכונות דינמיות.

ניקח לדוגמה מנוע רינדור כלשהו (לא משנה מאיזה framework או עדה
)

נאמר שיש לנו אובייקט שמייצג את ה-view. אובייקט זה מקבל מידע (data) ותבנית להצגה.
אובייקט ה-view הינו אובייקט שאינו מודע למידע שלו זקוקה התבנית. מדובר על אובייקט שיכול לרנדר כל תבנית.
הצבת הנתונים לאובייקט כזה יכולה להתבצע בשתי דרכים, או באמצעות פונקצית השמה, או על ידי שימוש ביכולות הדינמיות של האובייקטים.

נקח כדוגמה את התבנית הבאה:
http://pastebin.com/b6SNMim3
(כאשר this מייצג את אובייקט ה-view שלנו..)

דרך אחת להציב נתונים, בצורה מפורשת:
http://pastebin.com/C0PvZVAL

דרך שניה, על ידי שימוש במנגנונים הקסומים של PHP
http://pastebin.com/gM9mLbBK
כאשר את מטפלת ברקע בצורה בה PHP שומר את הנתונים הדינמיים הללו, ולא הופכת אותם ל-members "אמיתיים" של האובייקט.

שימי לב שגם בתבנית השתמשתי בתחביר "קסום" - כמובן שניתן היה להשתמש בפונקציה בצורה מופרשת לקבל נתונים שהוצבו ל-view או לחילופין, לספק פונקציה קסומה שתדע להביא את הנתון.
הנה דוגמת קוד עם מימוש סופר בסיסי של התיאור לעיל:
http://pastebin.com/UjVtB82N

בהצלחה,
 

קרמיט524

New member
טוב, הגיע הזמן שאקרא קצת על פונקציות קסומות

מסתבר שזה לא רעיון טוב להכיר רק את __construct
, צריך להתקדם בחיים.

וזה שקוראים להם "קסומות" זאת שערוריה בפני עצמה.
 
למעלה