#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 о ссылках.