דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. References ב-PHP

References ב-PHP

מתוזמן נעוץ נעול הועבר תכנות
42 פוסטים 7 כותבים 981 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מנותק
    yossizY מנותק
    yossiz
    השיב לchagold ב נערך לאחרונה על ידי
    #5

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

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    chagoldC תגובה 1 תגובה אחרונה
    0
    • yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי
      #6

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

      לצערי עוד לא הבנתי...

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      תגובה 1 תגובה אחרונה
      0
      • nigunN מנותק
        nigunN מנותק
        nigun
        השיב לyossiz ב נערך לאחרונה על ידי
        #7

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

        מייל: nigun@duck.com

        yossizY dovidD 2 תגובות תגובה אחרונה
        6
        • chagoldC מנותק
          chagoldC מנותק
          chagold
          השיב לyossiz ב נערך לאחרונה על ידי
          #8

          @yossiz אמר בReferences ב-PHP:

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

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

          תגובה 1 תגובה אחרונה
          1
          • yossizY מנותק
            yossizY מנותק
            yossiz
            השיב לnigun ב נערך לאחרונה על ידי
            #9

            @nigun אמר בReferences ב-PHP:

            איך אתה מגיע לנישות האלו כשאתה מתחיל ללמוד שפה?

            א קשיא אויף א מעשה...
            יש תשובה או אין?

            אם אני הגעתי לזה תוך 24 שעות, כל אחד היה אמור להגיע לזה תוך כמה שנים. לא?

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            nigunN 2 תגובות תגובה אחרונה
            1
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              השיב לnigun ב נערך לאחרונה על ידי
              #10

              @nigun אני מסכים איתך שמצביעים בשפות אחרות זה נושא מתקדם (בהתאם לרמת עיליות השפה),
              אבל פה זה לא מדוייק, כי ספציפית בPHP העברת פרמטר עם התייחסות מחייבת שימוש ב& ולטעמי מדובר ביכולת בסיסית. כלל מתכנתי PHP שמסתובבים פה ולא מכירים את זה הם כנראה יותר משתמשי ימות המשיח מתקדמים מאשר מתכנתים במקור.

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              5
              • yossizY מנותק
                yossizY מנותק
                yossiz
                כתב ב נערך לאחרונה על ידי yossiz
                #11

                עזבו את ה"מטה-שיח", יש למישהו הסבר?

                @chagold אמר בReferences ב-PHP:

                ג. 2 השורות האחרונות השתנו בדוגמא שלי.

                צודק, לא שמתי לב.

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

                יופי, הסברת מצויין את המושג של references. זה אני מכיר כבר.

                אבל זה עדיין לא מסביר לי את התופעה.

                הרי בהעתקה רגילה של array לדוגמה:

                <?php
                $arr = [1,2,3];
                $arr2 = $arr;
                $arr2[0] = 99;
                print_r($arr);
                

                ה-array השני מקבל העתקים של הערכים של הראשון ולא references.

                אבל בקוד שאני שואל עליו רואים כמה דברים מוזרים מאוד.

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

                ב. רואים ש-reference הוא סוג חדש של משתנה! זה לא מוזכר בתיעוד. אני חשבתי שהוא פשוט עוד שם/ידית לאותו ערך בזכרון (כמו references ב-++C למי שמכיר). הם עצמם מסבירים את זה כמו hardlink במערכות קבצים של unix. אבל זה לא! כי שם hardlink הוא בדיוק קובץ רגיל, רק שהוא מצביע קובץ שכבר יש לו מצביע אחר במערכת הקבצים. אבל כאן זו משתנה עם התנהגות שונה!
                מה שהכי מוזר שבינתיים נתקלתי בהתנהגות שונה אך ורק בנוגע להעתקת array. האם יש עוד מקומות שבהם reference מתנהג בצורה שונה ממשתנה רגיל?

                ג. רואים שלמרות שהשמה מ-reference בד"כ עושה העתקה, ולא reference. לדוגמה:

                <?php
                $a = 1;
                $b = &$a;
                $c = $a;
                // או
                $c = $b;
                $c = 2;
                print "$a, $b, $c";
                

                בדוגמה הנ"ל, למרות ש-‎$a ו-b$ הם משתנים מסוג reference עדיין העתקה שלהם יתן משתנה חדש ולא reference.

                למרות זאת, בהעתקה של מערך (שכזכור גם עושה העתקה ולא reference) אם יש איבר במערך שהוא מסוג reference אז המערך החדש תקבל reference.

                ד. עוד נקודה מוזרה ביותר.
                הרי ידוע שמטעמי ביצועים PHP עושה copy on write. כלומר גם בהעתקה, עד שאתה משנה משהו זה עדיין מצביע על הזכרון המקורי.
                רק ברגע השינוי אז PHP עושה העתקה.
                לדעתי פרט במימוש לא אמור להשפיע על ההתנהגות של הקוד אבל כאן זה כן משפיע, כי שים לב: שמתי את הקריאה ל-unset אחרי ה"העתקה" (המוצהרת), ובכל זאת זה פותר את הבעיה כל עוד שהוא לפני ההעתקה בפועל.

                למישהו יש שום לימוד זכות על שפה מוזרה זאת????

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                nigunN תגובה 1 תגובה אחרונה
                3
                • yossizY מנותק
                  yossizY מנותק
                  yossiz
                  כתב ב נערך לאחרונה על ידי
                  #12

                  אגב, למי שעוד לא יודע. reference לא דומה כלל וכלל למצביע ב-C ושפות אחרות. זה יותר דומה ל-reference ב-++C.

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  תגובה 1 תגובה אחרונה
                  1
                  • nigunN מנותק
                    nigunN מנותק
                    nigun
                    השיב לyossiz ב נערך לאחרונה על ידי
                    #13

                    @yossiz
                    מצאתי דיון בנושא דומה.
                    נראה שהמסקנה של מפתחי השפה היא "זה לא באג זה פיצ'ר".

                    מייל: nigun@duck.com

                    yossizY תגובה 1 תגובה אחרונה
                    2
                    • yossizY מנותק
                      yossizY מנותק
                      yossiz
                      השיב לnigun ב נערך לאחרונה על ידי yossiz
                      #14

                      @nigun אוף! זה לא קשור כלל.

                      אבל דוקא כאשר:
                      @yossiz אמר בReferences ב-PHP:

                      (יש לי עוד המון דוגמאות).

                      התכוונתי גם לזה בתוכם.

                      פה מדובר ב"באג" מעצבן אחר ש-foreach לא יוצר scope חדש.
                      זה לא באמת באג אלא חוסר תכנון (דבר שמאפיין את כל השפה...)
                      זה לא קשור ישירות ל-references אבל כאשר אתה משתמש ב-reference זה נהיה ממש מסוכן, עם משתנים רגילים זה פשוט מלכלך את ה-scope אבל הוא לא מסוכן.

                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                      תגובה 1 תגובה אחרונה
                      2
                      • nigunN מנותק
                        nigunN מנותק
                        nigun
                        השיב לyossiz ב נערך לאחרונה על ידי nigun
                        #15

                        @yossiz אמר בReferences ב-PHP:

                        אם אני הגעתי לזה תוך 24 שעות, כל אחד היה אמור להגיע לזה תוך כמה שנים. לא?

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

                        מייל: nigun@duck.com

                        תגובה 1 תגובה אחרונה
                        4
                        • yossizY מנותק
                          yossizY מנותק
                          yossiz
                          כתב ב נערך לאחרונה על ידי
                          #16

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

                          רואים ש-reference הוא סוג חדש של משתנה! זה לא מוזכר בתיעוד.

                          מתוך הספר phpintenals

                          While from a userland perspective references are not a separate type, internally references are represented as a wrapper around another zval, that can be shared by multiple places.

                          כנראה שהנסיון לבודד את ה-userland מפרטי מימוש לא בדיוק הצליח...

                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                          תגובה 1 תגובה אחרונה
                          4
                          • yossizY מנותק
                            yossizY מנותק
                            yossiz
                            כתב ב נערך לאחרונה על ידי yossiz
                            #17

                            עדכון:
                            https://www.phpinternalsbook.com/php7/zvals/references.html#reference-semantics:~:text=Intuitively this behavior is wrong

                            סוף סוף הסבר להתנהגות (והודאה שזה מרגיש לא נכון)

                            אגב, לא הבנתי את הטעם השני. (הראשון נראה לי שהבנתי אבל אני לא מסכים...)

                            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                            תגובה 1 תגובה אחרונה
                            4
                            • nigunN מנותק
                              nigunN מנותק
                              nigun
                              השיב לyossiz ב נערך לאחרונה על ידי nigun
                              #18

                              @yossiz אמר בReferences ב-PHP:

                              @nigun אמר בReferences ב-PHP:

                              איך אתה מגיע לנישות האלו כשאתה מתחיל ללמוד שפה?

                              אם אני הגעתי לזה תוך 24 שעות, כל אחד היה אמור להגיע לזה תוך כמה שנים. לא?

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

                              מייל: nigun@duck.com

                              yossizY תגובה 1 תגובה אחרונה
                              5
                              • yossizY מנותק
                                yossizY מנותק
                                yossiz
                                השיב לnigun ב נערך לאחרונה על ידי
                                #19

                                @nigun זה כלום, אין פה סיפור ארוך.
                                רציתי ללמוד את השפה.
                                נתקלתי במושג של reference.
                                הסתכלתי בתיעוד הרשמי.
                                אגב, בתיעוד של PHP תמיד תסתכל בהערות (רק 2/3 העליונים) של הקהילה. יש שם דברים יקרי ערך.
                                והנה בהערה הראשונה נתקלתי בזה.
                                התפלאתי מאוד.
                                המשך הסיפור כולו בפוסטים בנושא זה.

                                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                תגובה 1 תגובה אחרונה
                                5
                                • yossizY מנותק
                                  yossizY מנותק
                                  yossiz
                                  כתב ב נערך לאחרונה על ידי yossiz
                                  #20

                                  טוב, הגעתי פחות או יותר לסוף הדרך... 🤸 🚥
                                  שאלתי כאן: https://chat.stackoverflow.com/transcript/message/51562731#51562731
                                  ונעניתי על ידי אחד מהמפתחים העקריים של PHP בזה"ל:

                                  I see you have discovered the joy that is references

                                  כנראה שזו באמת פינה אפילה בשפה שאף אחד לא אמור לנבור של יותר מדי...
                                  (עיין בהמשך, יש יותר שיח מסביב לנושא)

                                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                  nigunN תגובה 1 תגובה אחרונה
                                  3
                                  • yossizY מנותק
                                    yossizY מנותק
                                    yossiz
                                    כתב ב נערך לאחרונה על ידי
                                    #21

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

                                    נו נו, פל קל אמרנו?

                                    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                    תגובה 1 תגובה אחרונה
                                    4
                                    • nigunN מנותק
                                      nigunN מנותק
                                      nigun
                                      השיב לyossiz ב נערך לאחרונה על ידי
                                      #22

                                      @yossiz
                                      אז סתם יצא כאן לעז על משתמשי השפה
                                      גם אחרי עשרות שנים מפתח PHP ממוצע לא אמור להיכנס לפינה הזאת.

                                      מייל: nigun@duck.com

                                      chagoldC yossizY 2 תגובות תגובה אחרונה
                                      0
                                      • chagoldC מנותק
                                        chagoldC מנותק
                                        chagold
                                        השיב לnigun ב נערך לאחרונה על ידי chagold
                                        #23

                                        @nigun אמר בReferences ב-PHP:

                                        @yossiz
                                        אז סתם יצא כאן לעז על משתמשי השפה
                                        גם אחרי עשרות שנים מפתח PHP ממוצע לא אמור להיכנס לפינה הזאת.

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

                                        בשבילי זה סיבה לנסות לא להיכנס לפינה ששמה הפניות.

                                        תגובה 1 תגובה אחרונה
                                        1
                                        • yossizY מנותק
                                          yossizY מנותק
                                          yossiz
                                          השיב לnigun ב נערך לאחרונה על ידי yossiz
                                          #24

                                          @nigun אמר בReferences ב-PHP:

                                          אז סתם יצא כאן לעז על משתמשי השפה

                                          לא דיברתי מטוב ועד רע על משתמשי השפה.
                                          ולגבי השפה עצמה, שפה שיש בה פינות אפלות כאלו היא באמת שפה גרועה.

                                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                          תגובה 1 תגובה אחרונה
                                          1

                                          • 1
                                          • 2
                                          • 3
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום