PHP/Klasy i obiekty: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Linia 8:
resident sleeper
 
to tez spanie jest
=== Zmienne obiektowe są referencjami ===
Wspomnieliśmy, że w PHP5 obiekty nie są rodzajem wartości, lecz oddzielnym bytem, do którego skrypt posiada jedynie referencje. Spójrzmy, czym to skutkuje w praktyce. Rozpatrzmy prosty skrypt:
 
<source lang="php" line><?php
function modify($value)
{
$value += 5;
} // end modify();
 
$number = 6;
modify($number);
echo $number;
</source>
 
Skrypt ten wyświetli nam wartość "6". Zmienna, na której operuje funkcja <code>modify()</code> jest jedynie kopią zmiennej globalnej <code>$number</code>, dlatego jej modyfikacja nie wpływa na wartość oryginału. Inaczej jest w przypadku obiektów:
 
<source lang="php" line><?php
require('./Person.php');
 
function modify($object)
{
$object->surname = 'Nowak';
} // end modify();
 
$janusz = new Person;
$janusz->setFullName('Janusz', 'Kowalski');
modify($janusz);
echo $janusz->getFullName();
</source>
 
Tym razem skrypt wyświetlił nam wartość <code>Janusz Nowak</code>, co oznacza, że zmiana stanu obiektu wprowadzona przez funkcję jest widoczna globalnie. Zachowanie jest jak najbardziej prawidłowe. Funkcja <code>modify()</code> operuje nie na kopii, ale na referencji do obiektu. Obie referencje: globalna <code>$janusz</code> oraz lokalna <code>$object</code> są oddzielne, ale wskazują na dokładnie ten sam obiekt. Dlatego wykonanie operacji poprzez jedną z nich sprawi, że druga także zauważy zmiany.
 
{{Infobox|Zapamiętaj, przekazanie zmiennej obiektowej przez argument lub przypisanie jej wartości operatorem '''<nowiki>=</nowiki>''' kopiuje jedynie referencję do obiektu, a nie obiekt.}}
 
Spróbuj w ramach ćwiczenia wykonać taką samą sztuczkę z operatorem przypisania.
 
=== Kontrola dostępu (hermetyzacja) ===