В соответствии с php docs :
По умолчанию аргументы функции передаются по значению (поэтому, если значение аргумента в функции изменяется, оно делаетне меняются за пределами функции).Чтобы функция могла изменять свои аргументы, они должны передаваться по ссылке.
Чтобы аргумент функции всегда передавался по ссылке, добавьте амперсанд (&) к имени аргумента в определении функции.
В B::foo
вы изменяете не переменную, а свойство объекта переменной.Вот почему вы получаете 42
В B::bar
вы изменяете переменную напрямую.Он изменен на новый экземпляр A
.Внутри B::bar
значение $bar->foo === 1
.
Указатели: Указатели создаются всякий раз, когда объект создается и присваивается переменной.Эта переменная хранит адрес памяти для доступа к объекту.
Ссылки: Ссылки создаются с амперсандом (&).
//from your link posted
$a = new Foo; // $a is a pointer pointing to Foo object 0
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0