שלום ‏אורח!
דוא"ל:  סיסמא:  
זכור אותי   |   שכחת סיסמה?   |   להרשמה בחינם עכשיו!
« חזור לפורום תכנות ופיתוח סה"כ 2 תגובות על פני 1 עמודים
Itay Sela

שם:
Itay Sela
הודעות: 342
ותיק
Value Type & Reference Type in PHP.
בהמשך לשיחה שלי במסנג'ר עם שי: הסבר קצת על Value Type וReference Type בPHP:



class x{

    private $n;
    public function setN($newN){
        $this->n = $newN;
    }
    public function print_n(){
        echo $this->n . "<br />";
    }
}

$x1 = new x();
$x1->setN("10");
$x2 = $x1;
$x2->setN("20");
$x1->print_n();
$x2->print_n();

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

 לעומת זאת - משתנים פרימיטיבים(מספרים, מחרוזות תווים ובוליין) - מועברים כברירת מחדל כValue Type(משמע שהם לא מצביעים לאותו מקום בזיכרון, אלה פשוט מכילים את אותו ערך - שינוי של אחד לא יוביל לשינוי של אחר)

 $p = 5;
$z = $p;
$z = $z + 10;
echo "<br />" . $p . "<br />";
echo $z;


 מדפיס 5, 15
 וגם אותם - את הפרימיטיבים - אפשר להעביר כייחוס - ע"י הוספת &.
 
 $p = 5;
$z = &$p;
$z = $z + 10;
echo "<br />" . $p . "<br />";
echo $z;

 שם לב לשורה השניה. הקוד הזה מדפיס 15 15.


אחרי ההשקעה הרבה שי הרגיש את הצורך להגיד לי "תודה על ההסבר המפורט אם כי לא חידשת לי". ערור אתה שי.


---
עריכה:
דבר נוסף שחושב לדעת בנושא הינו:
כאשר אנו מעבירים פרמטרים פרימיטיבים לפונקציה - הפרמטרים מועברים באופן אוטומטי כValue Type:
 

function change($num){
    $num = 5;
}

$x = 10;
change($x);

echo $x;
הקוד הנ"ל ידפיס 10. זאת מכיוון שהמשתנה שמועבר מועבר כValue Type - משמע שבתוך הפונקציה num אכן משתנה ל5 אך זה לא משפיע על x החיצוני כי למעשה הם שניהם שני משתנים שונים.

לעומת זאת, כאשר נעביר את המשתנה תוך כדי שימוש באופרטור &:
 
function change(& $num){
    $num = 5;
}

$x = 10;
change($x);

echo $x;

 
הקוד ידפיס 5. כיוון שמועבר ייחוס למשתנה x ולכן בתוך הפונקציה הערך של המשתנה x החיצוני משתנה.
כאשר נשים את הסימן & לפני הפרמטר שהפונקציה מקבלת (השורה הראשונה של הפוקציה) - כל פעם שנקרא לפונקציה - הפרמטר יועבר כייחוס.

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

function change($num){
    $num = 5;
}

$x = 10;
change(& $x);

$y = 10;
change($y);
echo $x;

 
בדוגמא זו x ידפיס 5 ואילו y ידפיס 10. זאת מכיוון שאת x מעבירים כיחוס ואת y כערך.
 


לעומת זאת, כאשר מעבירים אובייקטים לפונקציה - הם מועברים כייחוס:

function change($num){
    $num->setN(100);
}


$z = new x();
$z->setN(10);
$z->print_n();
change($z);
$z->print_n();

הקוד ידפיס 10 ולאחר מיכן 100. (האובייקט מועבר כייחוס ועל כן הפונקציה משתנה את ערכו)

13:01 | 25/12/09 מסר אישי הודעה חדשה
Exalted Web

שם:
שי בן משה
הודעות: 1275
ותיק
להגנתי רק אומר שבסה"כ שאלתי "אובייקטים תמיד מתנהגים כמו רפרנס נכון?" =]
צוחק, אחלה הסבר ושוב תודה וסליחה ^^

13:09 | 25/12/09 מסר אישי הודעה חדשה
אלי רוטנברג

שם:
אלי רוטנברג
הודעות: 2029
ותיק
חחח איזה ויכוח מטומטם :)
ח"ח לאיתי על ההסבר :D

13:58 | 25/12/09 מסר אישי הודעה חדשה