За последние 24 часа нас посетили 18084 программиста и 1662 робота. Сейчас ищет 1631 программист ...

Как ведут себя ссылки (указатели)?

Тема в разделе "PHP для новичков", создана пользователем peaceful, 21 мар 2010.

  1. peaceful

    peaceful Активный пользователь

    С нами с:
    21 мар 2010
    Сообщения:
    7
    Симпатии:
    0
    Перечитал всю документацию, однако там нет ничего по моей ситуации.
    Простой пример:
    PHP:
    1. <?php
    2. function fun (&$a1, &$a2, &$b1, &$b2) {
    3.   if (rand(1, 2)%2 == 0) {
    4.     $b1 = &$a1;
    5.     $b2 = &$a2;
    6.   }
    7.   else {
    8.     $b1 = &$a2;
    9.     $b2 = &$a1;
    10.   }
    11. }
    12.  
    13. $a1 = array(1, 3, 5, 7, 9);
    14. $a2 = array(2, 4, 6, 8, 10);
    15. $b1 = NULL;
    16. $b2 = NULL;
    17. fun($a1, $a2, $b1, $b2);
    18. echo "\n<div>a1=".print_r($a1, 1).".</div>";
    19. echo "\n<div>a2=".print_r($a2, 1).".</div>";
    20. echo "\n<div>b1=".print_r($b1, 1).".</div>";
    21. echo "\n<div>b2=".print_r($b2, 1).".</div>";
    22. ?>
    Результат:
    HTML:
    1. a1=Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 ) .
    2. a2=Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 ) .
    3. b1=.
    4. b2=.
    Ожидалось:
    HTML:
    1. a1=Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 ) .
    2. a2=Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 ) .
    3. b1=Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 ) .
    4. b2=Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 ) .
    Я что-то не учёл? Почему ожидаемое расходится с действительностью?
    Ну, и - как получить желаемое? :)
     
  2. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    fun(&$a1, &$a2, &$b1, &$b2);
     
  3. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Да нет в РНР указателей.
    Ссылка - это просто ещё одно имя для одного и того же содержимого.
     
  4. peaceful

    peaceful Активный пользователь

    С нами с:
    21 мар 2010
    Сообщения:
    7
    Симпатии:
    0
    не помогло.
     
  5. peaceful

    peaceful Активный пользователь

    С нами с:
    21 мар 2010
    Сообщения:
    7
    Симпатии:
    0
    Насрать :) Подскажи лучше рабочий вариант.
     
  6. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    PHP:
    1.     if (rand(1, 2)%2 == 0) {
    2.       $b1 = $a1;
    3.       $b2 = $a2;
    4.     }
    5.    else {
    6.      $b1 = $a2;
    7.      $b2 = $a1;
    8.     }
    Внутри функции надо оставлять ссылки не на локальные ссылки
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?php
    2.  function fun (&$a1, &$a2, &$b1, &$b2) {
    3.    if (rand(1, 2)%2 == 0) {
    4.      $b1 = $a1;
    5.      $b2 = $a2;
    6.    }
    7.    else {
    8.      $b1 = $a2;
    9.      $b2 = $a1;
    10.    }
    11.  }
    12.  
    13.  $a1 = array(1, 3, 5, 7, 9);
    14.  $a2 = array(2, 4, 6, 8, 10);
    15.  $b1 = NULL;
    16.  $b2 = NULL;
    17.  fun($a1, $a2, $b1, $b2);
    18.  echo "\n<div>a1=".print_r($a1, 1).".</div>";
    19.  echo "\n<div>a2=".print_r($a2, 1).".</div>";
    20.  echo "\n<div>b1=".print_r($b1, 1).".</div>";
    21.  echo "\n<div>b2=".print_r($b2, 1).".</div>";
    22.  ?>
     
  8. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Если внимательно почитать доку, то вообще-то там всё написано.

    Я от тебя такого не ожидал =)
    Ну ей богу.
     
  9. peaceful

    peaceful Активный пользователь

    С нами с:
    21 мар 2010
    Сообщения:
    7
    Симпатии:
    0
    Такой код делает копии а не ссылки. Т.е. при изменении $a1, $b1 (или $b2) остаются без изменений.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Объекты передаются по тру ссылкам
    PHP:
    1. <?php
    2. function fun($a1, $a2, &$b1, &$b2)
    3. {
    4.     if (rand(1,2)%2)
    5.     {
    6.         $b1 = $a1;
    7.         $b2 = $a2;
    8.     }
    9.     else
    10.     {
    11.         $b1 = $a2;
    12.         $b2 = $a1;
    13.     }
    14. }
    15. $a1 = new arrayObject();
    16. $a2 = new arrayObject();
    17. for ($i=0; $i<10; $i++)
    18. {
    19.     $i%2 ? $a1[] = $i : $a2[] = $i;
    20. }
    21. fun($a1, $a2, $b1, $b2);
    22. $a1[0] = 'Вася';
    23. $b1[1] = 'Хацкер';
    24. echo '<pre>';
    25. print_r($a1);
    26. print_r($a2);
    27. print_r($b1);
    28. print_r($b2);
     
  11. peaceful

    peaceful Активный пользователь

    С нами с:
    21 мар 2010
    Сообщения:
    7
    Симпатии:
    0
    Благодарю, vs, работает :)
    а какое описание функции предпочтительнее:
    Код (Text):
    1. function fun($a1, $a2, &$b1, &$b2)
    или
    Код (Text):
    1. function fun(&$a1, &$a2, &$b1, &$b2)
    ?
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    peaceful
    Объекты в PHP всегда передаются по ссылке
    PHP:
    1.  
    2. <?php
    3. $a = new arrayObject();
    4. $b = $a;
    5. $b[0] = 1;
    6. echo $a[0]; //1
    7.  
    символ & я поставил перед $b1 и $b2, чтобы не надо было инициализировать их в скрипте (они создадутся без ошибок).
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    та да, я еще спал в то время ))