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

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

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

References ב-PHP

מתוזמן נעוץ נעול הועבר תכנות
42 פוסטים 7 כותבים 981 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • 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
                    • yossizY מנותק
                      yossizY מנותק
                      yossiz
                      כתב ב נערך לאחרונה על ידי yossiz
                      #25

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

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

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

                        עוד כתבה על הנושא:
                        http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

                        טוב, נראה לי שממש מיציתי את הנושא... מספיק כבר! 🤢

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

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

                          אופסס... כנראה שלא מיציתי את הנושא מספיק... 🤢
                          מצאתי שיש קומפיילר וסביבת הרצה עבור PHP שממומש בדוטנט.
                          ויקרא שמו בישראל Peachpie.
                          (אגב, הם טוענים שהמימוש בדוטנט מביא שיפורים משמעותיים בביצועים. זה כבר בשל מספיק להריץ וורדפרס ועוד כמה אפליקציות גדולות - עם ביצועים יותר טובים ממנוע ה-PHP המקורי)
                          כמובן שדבר ראשון רצתי לבדוק את המימוש שלהם ל-references, והנה יש להם באג 😂
                          נפתח issue בגיטהאב שלהם...

                          עריכה: פתחתי issue
                          https://github.com/peachpiecompiler/peachpie/issues/906

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

                          תגובה 1 תגובה אחרונה
                          4
                          • שואףש מנותק
                            שואףש מנותק
                            שואף
                            כתב ב נערך לאחרונה על ידי שואף
                            #28

                            @yossiz אהבתי התשובה שענו לך https://chat.stackoverflow.com/transcript/message/51562731#51562731

                            @yossizahn It's a bit like the answer to "how do you avoid being eaten by a shark?" Step 1) don't go swimming where there are sharks.
                            
                            

                            ליצירת קשר: admin@i-call.me

                            הידד! גישה למייל גם בלי מחשב ואינטרנט!

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

                              @שואף מתכנת PHP דגול כמותך, זה כל מה שיש לך להוסיף בנושא? 🙂
                              סתם... נראה שבאמת לא אמורים להשתמש ב-references בלי סיבה מספקת.

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

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

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

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

                                ליצירת קשר: admin@i-call.me

                                הידד! גישה למייל גם בלי מחשב ואינטרנט!

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

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

                                          $rows = self::find()
                                              ->where(['ProjectID' => \common\models\GetProjectID::getProjectID()])
                                              ->andWhere(['id' => $selection])
                                              ->andWhere(['is', 'PaymentDetails', new \yii\db\Expression('null')])->asArray()->all();
                                          $rows2 = [];
                                          foreach ($rows as $row){
                                              if ($row['TotalToPaid'] > 0) {
                                                  if (isset($Students[$row['StudentId']])) {
                                                      $row['Bank'] = $Students[$row['StudentId']]['BankNumber'];
                                                      $row['Branch'] = $Students[$row['StudentId']]['BranchNumber'];
                                                      $row['AccountNumber'] = $Students[$row['StudentId']]['AccountNumber'];
                                                      $row['TeudatZehut'] = $Students[$row['StudentId']]['Identity'];
                                                      $row['ClientName'] = $Students[$row['StudentId']]['Family'] . ' ' . $Students[$row['StudentId']]['Name'];
                                                  }else{
                                                      $row['Bank'] = '';
                                                      $row['Branch'] = '';
                                                      $row['AccountNumber'] = '';
                                                      $row['TeudatZehut'] = '';
                                                      $row['ClientName'] = '';
                                                  }
                                                  $rows2[] = $row;
                                              }
                                          }
                                          return $rows2;
                                  

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

                                          $rows = self::find()
                                              ->where(['ProjectID' => \common\models\GetProjectID::getProjectID()])
                                              ->andWhere(['id' => $selection])
                                              ->andWhere(['is', 'PaymentDetails', new \yii\db\Expression('null')])->asArray()->all();
                                          foreach ($rows as $row){
                                              if ($row['TotalToPaid'] > 0) {
                                                  if (isset($Students[$row['StudentId']])) {
                                                      $row['Bank'] = $Students[$row['StudentId']]['BankNumber'];
                                                      $row['Branch'] = $Students[$row['StudentId']]['BranchNumber'];
                                                      $row['AccountNumber'] = $Students[$row['StudentId']]['AccountNumber'];
                                                      $row['TeudatZehut'] = $Students[$row['StudentId']]['Identity'];
                                                      $row['ClientName'] = $Students[$row['StudentId']]['Family'] . ' ' . $Students[$row['StudentId']]['Name'];
                                                  }else{
                                                      $row['Bank'] = '';
                                                      $row['Branch'] = '';
                                                      $row['AccountNumber'] = '';
                                                      $row['TeudatZehut'] = '';
                                                      $row['ClientName'] = '';
                                                  }
                                              }
                                          }
                                          return $rows;
                                  

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

                                  function setDescendantProp(obj, desc, value) {
                                    var arr = desc.split('.');
                                    while (arr.length > 1) {
                                      obj = obj[arr.shift()];
                                    }
                                    return obj[arr[0]] = value;
                                  }
                                  
                                  var obj = {a: {b: {c: 0}}};
                                  var propPath = getPropPath();  // returns e.g. "a.b.c"
                                  var result = setDescendantProp(obj, propPath, 1);  // obj.a.b.c will now be 1
                                  

                                  מקור: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

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

                                  dovidD yossizY WWWW 3 תגובות תגובה אחרונה
                                  2
                                  • dovidD מחובר
                                    dovidD מחובר
                                    dovid ניהול
                                    השיב לחוקר ב נערך לאחרונה על ידי dovid
                                    #32

                                    @חוקר אני בחיים לא צריך את הפונקציה הזאת...

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

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

                                    ח תגובה 1 תגובה אחרונה
                                    1
                                    • ח מנותק
                                      ח מנותק
                                      חוקר
                                      השיב לdovid ב נערך לאחרונה על ידי חוקר
                                      #33

                                      @dovid אמר בReferences ב-PHP:

                                      @חוקר אני בחיים לא צריך את הפונקציה הזאת...

                                      לפני

                                                          if (!myData.ExtraMessageReadingConfirmation[ProjectID]){
                                                              myData.ExtraMessageReadingConfirmation[ProjectID] = {};
                                                          }
                                                          if (!myData.ExtraMessageReadingConfirmation[ProjectID][messageId1]){
                                                              myData.ExtraMessageReadingConfirmation[ProjectID][messageId1] = {};
                                                          }
                                                          if (!myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId]){
                                                              myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId] = {};
                                                          }
                                                          myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId]['np'] = 1;
                                      

                                      אחרי

                                      __.setDescendantProp(myData.ExtraMessageReadingConfirmation, ProjectID + '.' + messageId1 + '.' + userId + '.' + 'np', 1);
                                      

                                      בצורת העבודה שלי יש לי המון אובייקטים שמכילים תתי אבוייקטים ותתי תתי וכו'.
                                      לפני הפונקציה הייתי משתגע איך אני מגדיר ערך לאובייקט שאני לא יודע אם כבר קיים הנתיב שלו דהיינו תתי/תתי תתי/תתי תתי תתי
                                      אם אגדיר אותו ישירות אקבל שגיאה שלא ניתן להגדיר ערך ל undefined.
                                      באמצעות הפונקציה הנ"ל ששידרגתי אותה לצורה כזו:

                                           setDescendantProp : function (obj, desc, value) {
                                               if (!desc){return obj = value;}
                                               let arr = desc.split('.');
                                               while (arr.length > 1) {
                                                   let shift = arr.shift();
                                                   if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                                                    obj = obj[shift];
                                                   if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
                                               }
                                               return obj[arr[0]] = value;
                                          },
                                      

                                      אני מגדיר בקלות את הנתיב המלא, ומזין את הערך הנדרש באובייקט המקורי - הגלובאלי

                                      dovidD תגובה 1 תגובה אחרונה
                                      2
                                      • ח מנותק
                                        ח מנותק
                                        חוקר
                                        כתב ב נערך לאחרונה על ידי חוקר
                                        #34

                                        להלן הסט המלא בשיטה זו:

                                            getDescendantProp : function (obj, desc, returnByUndefined = false) {
                                                if (!desc){return obj;}
                                                let arr = desc.split('.');
                                                while (arr.length && obj !== undefined) {
                                                    obj = obj[arr.shift()];
                                                }
                                                return obj;
                                            },
                                        
                                             setDescendantProp : function (obj, desc, value) {
                                                 if (!desc){return obj = value;}
                                                 let arr = desc.split('.');
                                                 while (arr.length > 1) {
                                                     let shift = arr.shift();
                                                     if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                                                      obj = obj[shift];
                                                     if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
                                                 }
                                                 return obj[arr[0]] = value;
                                            },
                                        
                                            addDescendantProp : function (obj, desc, value) {
                                                 if (!desc){return obj = value;}
                                                 let arr = desc.split('.');
                                                 while (arr.length > 1) {
                                                     let shift = arr.shift();
                                                     if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                                                      obj = obj[shift];
                                                     if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
                                                 }
                                                 if (!obj[arr[0]]){
                                                     obj[arr[0]] = 0;
                                                 }
                                                 return obj[arr[0]] += value;
                                            },
                                        
                                            addPlusDescendantProp : function (obj, desc) {
                                                 if (!desc){ if (!obj) {obj = 0} else {obj++} return obj}
                                                 let arr = desc.split('.');
                                                 while (arr.length > 1) {
                                                     let shift = arr.shift();
                                                     if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                                                      obj = obj[shift];
                                                     if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
                                                 }
                                                 if (!obj[arr[0]]){
                                                     obj[arr[0]] = 0;
                                                 }
                                                obj[arr[0]] = parseInt(obj[arr[0]]);
                                                 return obj[arr[0]]++;
                                            },
                                        
                                            addPropertyDescendantProp : function (obj, desc, key, value) {
                                                 if (!desc){return obj = value;}
                                                 let arr = desc.split('.');
                                                 while (arr.length > 1) {
                                                     let shift = arr.shift();
                                                     if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                                                      obj = obj[shift];
                                                     if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
                                                 }
                                                 if (!obj[arr[0]]){
                                                     obj[arr[0]] = {};
                                                 }
                                                obj[arr[0]][key] = value;
                                                 return obj[arr[0]];
                                            },
                                        
                                             delDescendantProp : function (obj, desc) {
                                                 if (!desc){return obj = value;}
                                                 let arr = desc.split('.');
                                                 while (arr.length > 1) {
                                                     obj = obj[arr.shift()];
                                                     if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
                                                 }
                                                 return delete obj[arr[0]];
                                            },
                                        
                                        

                                        דוגמאות שימוש:

                                        //הוספת סכום למשתנה שאינו בטוח קיים
                                        __.addDescendantProp(myData.IncomingCallMinutes, ApiDID + '.' + moment().format('YYYYMMDD'),  duration);
                                        
                                        //הוספת ++ למשתנה שלא בטוח שהוא קיים
                                        let countIp = __.addPlusDescendantProp(myData.ipBlocked, clientIp + '.' + 'count');
                                                                                
                                        //הוספת איבר והצבת ערך לאיבר, על משתנה שלא בטוח שהוא קיים
                                        __.addPropertyDescendantProp(id_data['Butza']['Mishnaiot'], seder_key +'.' + masecet_key +'.' + perek_key, i, [perek_obj['r' + i], __.getDescendantProp(myData.QuestionsAndAnswersMishnaiot, ProjectID + '.' + seder_key + '.' + masecet_key + '.' + perek_key + '.' + i + '.QValid') === parseInt(perek_obj['r' + i])])
                                        
                                        //מחיקת איבר פנימי                                        
                                        __.delDescendantProp(myData.QuestionsById, ProjectID + '.' + SelectedTrivia['id'] );
                                        yossizY תגובה 1 תגובה אחרונה
                                        1
                                        • dovidD מחובר
                                          dovidD מחובר
                                          dovid ניהול
                                          השיב לחוקר ב נערך לאחרונה על ידי
                                          #35

                                          @חוקר

                                          לא יודע למה הארכת, חשבת שלא הבנתי מה עושה הפונקציה?
                                          סה"כ התכוונתי להדגיש את העובדה ש:

                                          בצורת העבודה שלי

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

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

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

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

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

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

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