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. (האובייקט מועבר כייחוס ועל כן הפונקציה משתנה את ערכו)