Ссылка на объект

#php #oop

#php #ооп

Вопрос:

В PHP у меня есть этот простой класс

 <?php
class Person {
    var $first_name = "factory method";
}
?>
  

Вопрос, который у меня есть, заключается в том, есть ли у меня:

 $person1 = new Person();
$person2 = $person1;

$person1 = null;

var_dump($person1);
var_dump($person2);
  

что я получаю: и $ person1 = null, и $ person2 вообще не null, кажется, что $ person1 и $ person2 вообще не указывают на одно и то же.

но когда я делаю что-то вроде приведенного ниже:

 $person1 = new Person();
$person2 = $person1;
$person2->first_name = "programming";

echo $person1->first_name;
echo $person2->first_name;
  

Я получил то же самое «программирование», поэтому я думаю, что оба $ person1 и $ person2 указывают на одно и то же.

Не мог бы кто-нибудь объяснить мне, почему это так?

Комментарии:

1. Смотрите php.net/manual/en/language.oop5.references.php и комментарии.

Ответ №1:

Не путайте указатели со ссылками. После $person1 = null; эта переменная ссылается на что-то другое, потому что вы присваиваете переменной что-то другое. С помощью

 $person1 = $person2 = new Person;
  

Оба ссылаются на один и тот же экземпляр объекта. С помощью $person2->first_name вы изменяете этот объект, а не переменную, которая по-прежнему ссылается на объект.

Ответ №2:

После того, как вы присвоили $person1 значение null в первом примере, он больше не ссылается на созданный вами объект Person, но $ person2 все еще ссылается.

Во втором примере оба $person и $person2 ссылаются на один и тот же объект.

Смотрите руководство по PHP о ссылках.