Nie wiem dlaczego zmieniło property $name od $book2. Obiekty nie są przekazywane jako wartość?
Link do kodu http://sandbox.onlinephpfunctions.com/code/7e54cb6532275c3b60137a528e5669bc93799b19
Nie wiem dlaczego zmieniło property $name od $book2. Obiekty nie są przekazywane jako wartość?
Link do kodu http://sandbox.onlinephpfunctions.com/code/7e54cb6532275c3b60137a528e5669bc93799b19
Są, ale w wypadku obiektów tą wartością jest referencja do tego obiektu, a nie jego kopia.
Jakiego zachowania się spodziewałeś?
Spodziewałem się obiektu przekazanego jako wartość/tylko do odczytu.
W PHP - domyślnie - zmienne są przekazywane przez wartość. Jeżeli przekazujesz typ prosty, to jest to dosyć jasne. W przypadku obiektów tą wartością jest referencja do tego obiektu. Dzięki temu wewnątrz funkcji możesz zmodyfikować obiekt (bo masz do niego referencje), ale nie możesz go nadpisać.
<?php
$foo = new stdClass(); // foo trzyma referencje do tego konkretnego obiektu stdClass
$foo->zmienna = 1;
$bar = $foo; // teraz bar ma tą samą referencję
$bar->zmienna = 2;
var_dump($foo, $bar);
$a = 1;
$b = $a; // kopiujemy wartość
$b = 2;
var_dump($a, $b);
$dirtyA = 1;
$dirtyB =& $dirtyA;
$dirtyB = 2;
var_dump($dirtyA, $dirtyB); // no niestety :/
Niestety w PHP jest taki gówniany operator &$zmienna
, który Ci na to pozwala...
<?php
function modify(int &$number)
{
$number = 'foo';
}
$number = 1;
var_dump($number); // tu mamy 1
modify($number);
var_dump($number); // a tu 'foo' :/