За последние 24 часа нас посетили 23452 программиста и 1605 роботов. Сейчас ищут 862 программиста ...

Завис ... Указатели на объекты в ООП

Тема в разделе "PHP для новичков", создана пользователем iNEEdhLw, 3 фев 2015.

  1. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    код взят из мануала. прокомментирую в самом коде свою проблему
    Код (Text):
    1. <?php
    2. class SimpleClass
    3. {
    4.     public $var;
    5. }
    6. $instance = new SimpleClass(); // получили новый экземпляр класса
    7.  
    8. $assigned   =  $instance;
    9. /* присвоили новой переменной уже существующий экземпляр класса (в таком случае переменная должна указывать на этот же экземпляр класса, т.е. на $instance */
    10.  
    11.  
    12. $reference  =& $instance;
    13. /* ссылаемся на $instance , т.е. при изменении любой из этих переменных изменения понесут обе */
    14.  
    15.  
    16. $instance->var = '$assigned будет иметь это значение';
    17. /* а ещё $reference, но мануал умолчал об этом, ниже вардамп */
    18.  
    19.  
    20. var_dump ($reference); // object bla-bla...
    21. var_dump ($assigned); object bla-bla...
    22. echo "<br><br>";
    23.  
    24. $instance = null; // $instance и $reference становятся null **** А КАК ЖЕ $assigned?
    25.  
    26. var_dump($instance);
    27. var_dump($reference);
    28. var_dump($assigned);
    29. ?>
    пояснение: мне не понятно, что происходит. почему если $assigned указывает (ссылается) на $instance, то в конце она не становится null, как другие?
    туплю на ровном месте, сори :(
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    $assigned содержит ссылку на объект $instance.
    у меня это то же самое получается. А в чем конкретно проблема?
     
  3. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    ну, я понимаю пока что вот так:
    Код (Text):
    1.  
    2. $a = 10;
    3. $b =& $a;
    4. echo' $b; // 10
    5. $a = 17;
    6. echo $b; // 17
    в данном случае $assigned ссылается на переменную-объект $instance, которой присвоили нулевое значение, но сама $assigned не изменилась, хотя, как я предполагаю, должна была измениться на null.
    как всегда: дьявол кроется в деталях - мне нужно понять детали.
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    вардамп для первого и второго получается одинаковый
    Код (Text):
    1. object(SimpleClass)#1 (1) {
    2.   ["var"]=>
    3.   NULL
    4. }
    5. object(SimpleClass)#1 (1) {
    6.   ["var"]=>
    7.   NULL
    8. }
     
  5. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    я, видимо, неправильно изъясняюсь (моя вечная проблема).
    я считаю, что вардамп третьего ( $assigned) тоже должен быть равен "NULL", ведь он, как говорит мануал, указывает (ссылается) на $instance (объект), которому присвоили NULL.
    если одному присвоили NULL, то и другой должен стать таким же...

    Добавлено спустя 39 секунд:
    если опять непонятно написал, подметьте это - попробую лучше пояснить свой вопрос)
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    все ок. Никто не рождается всезнающим)

    Но опять таки, у меня все ок.
    Код (Text):
    1.  
    2.  
    3. <?php
    4. class SimpleClass
    5. {
    6.     public $var;
    7. }
    8. $instance = new SimpleClass(); // получили новый экземпляр класса
    9.  
    10. $assigned   =  $instance;
    11.  
    12. $assigned->var = "тестовое значение";
    13.  
    14. echo "<pre>";
    15. var_dump($instance);
    16.  
    17.  
    18. var_dump($assigned);
    19. echo "</pre>";
    Код (Text):
    1. object(SimpleClass)#1 (1) {
    2.   ["var"]=>
    3.   string(33) "тестовое значение"
    4. }
    5. object(SimpleClass)#1 (1) {
    6.   ["var"]=>
    7.   string(33) "тестовое значение"
    8. }
    Добавлено спустя 13 минут 50 секунд:
    В PHP 4 копирование объекта выполнялость очень просто - достаточно было присвоить значение одной объектной переменной другой
    Код (Text):
    1.  
    2. Class CopyMe{}
    3. $first = new CopeMe();
    4. $second = $first;
    5. //В PHP 4 переменные $second and $first ссылаются на 2 разных обекта
    6. //Начиная с PHP 5 переменные $second and $first ссылаются на один объект
    В PHP 5 объекты всегда присваиваются и передаются по ссылке. Это означает, что если предыдущий пример запустить в PHP 5, переенные $first и $second будут содержать ссылки на один и тот же объект, а не на две его копии.

    если нужно получиь копию объекта, то используй clone
     
  7. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    так-с, то есть разницы для объектов между "=" и "=&" нет?
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    этим ты уничтожил ссылку на объект.
    $instance->var = null; - значения свойств менять только так.

    Добавлено спустя 3 минуты 20 секунд:
    Добавлено спустя 33 секунды:
    еще вот, почитай
    https://php.net/manual/ru/language.references
     
  9. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    а-а. вроде бы осознал.
    буду распознавать так:
    $instance ссылается на класс SimpleClass и является эекземпляром данного класса.
    $assigned ссылается теперь тоже на класс SimpleClass.
    а $reference ссылается на $instance(ссылку на класс SimpleClass).
    Код (Text):
    1. $instance = new SimpleClass();
    2.  
    3. $assigned   =  $instance;
    4. $reference  =& $instance;
    и тогда по коду происходит уничтожение ссылки на класс, на которую ссылается $reference.

    Добавлено спустя 2 минуты 16 секунд:
    спасибо, прочту. просто иду по мануалу, так сказать, по оглавлению, а ссылки там ещё не встречались в подробном виде.