הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   משהו מוזר בהורשה בPHP (https://hosts.co.il/forums/showthread.php?t=89200)

link 24-04-11 23:47

משהו מוזר בהורשה בPHP
 
שלום לכולם,
ניסיתי לעשות איזו בדיקה קטנה בPHP בנוגע להורשות ומסתבר שמשהו מתפקשש ואני לא מבין למה.
עשיתי מחלקה עם איזה סתם משתמש וכשאני עושה מחלקה שמקבלת בהורשה מהמחלקה הקודמת, המחלקה החדשה לא מדפיסה לי את המשתמש של המחלקה המקורית.
להלן הקוד:
PHP קוד:

<?php

class test
{
    var 
$check;

    function 
test($test)
    {
        
$this->check $test;
        echo 
$this->check .'<br />';
    }
}

$bellboy = new test('roy');

class 
second extends test
{
    function 
second()
    {
        echo 
$this->check;
    }
}

$bellgirl = new second;

?>

אני לא מבין למה $this->check לא מודפס לי עוד הפעם. יכול להיות שזו בעיה רק אצלי בשרת?

תודה רבה,
רועי.

בניה 25-04-11 00:42

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

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

link 25-04-11 01:07

אוקי, אז אם אין לי אפשרות לגשת למשתנים מהמחלקה הקודמת - אז למה להוריש?

בניה 25-04-11 01:45

המטרה של הורשה זה לא לגשת למופעים אחרים אלא למחזר את הקוד של המחלקה הקודמת.

PHP קוד:

<?php
class myparentclass {
    
    public 
$data 'asdasdf';
    
    public function 
__construct() {
        
    }
    
}


class 
mychildclass extends myparentclass {
    
    
    public function 
__construct() {
        echo 
$this->data;
    }
    
}


$obj = new mychildclass();
?>

זה לדוגמא יציג לך את הערך של המשתנה data של מחלקת האב כי זה משהו שאפשר לרשת כי הוא מוגדר בתוך המחלקה.

link 25-04-11 16:57

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

בכול מקרה, לא משנה. תודה על העזרה בכל מקרה.

BlueNosE 25-04-11 17:17

תשתמש בsuper(), או בPHP - פשוט תקרא שוב לconstructor. תכתוב $this->test() בתוך הקונסטרטור של המחלקה היורשת.

link 25-04-11 17:36

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

Shay Ben Moshe 25-04-11 18:25

לא. אתה טועה לחלוטין. פיספסת את כל היסודות של תכנות מונחה עצמים.
בקצרה - יש לך מחלקות שמייצגות טיפוסי נתונים (test וsecond). יש לך מופעים שהם אובייקטים של המחלקה ($bellboy ו$bellgirl). אין קשר בין המופעים השונים של המחלקה, והם אינם משפיעים זה על זה. ההורשה היא לא בין מופעים אלא בין מחלקות.

אם אתה רוצה אתה יכול להיכנס לבלוג שלי, פרסמתי סדרת פוסטים על תכנות מונחה עצמים נכנסתי שם לכל נושא לעומק.
http://www.xn----0hcb6acyq1epc.com/%...3%D7%A7%D7%A1/

link 26-04-11 00:17

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

Shay Ben Moshe 26-04-11 00:22

מה הכוונה לתקשר בין מחלקות?
אם אתה מכיר שפה שבה הדבר שאתה מדבר עליו קיים אתה מוזמן לרשום כאן דוגמת קוד, שנבין במה מדובר.


כל הזמנים הם GMT +2. הזמן כעת הוא 22:36.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ