Nie chcesz mieć w klasie pól publicznych? Nie chce Ci sie robić setterów i getterów dla klasy? W takim razie mam prawo nazwać Cię troszke leniem.
Jeśli zaczynasz zabawę z OOP to powinieneć wiedzieć, że do prywatnej właściwości klasy nie można odwołać się tak:
$object = new Object;
echo $object->privateProperty;
Taku skrypt spowoduje pojawienie się błędu w drugiej linijce, pod założeniem, że właściwość privateProperty jest prywatna.
Teraz przeanalizujmy Twój kod klasy User:
class User {
private $id;
private $other;
public function __construct() {
$this->id = null;
$this->other = array ('username' =>'', 'pass' => '', 'mail' => ''); }
}
$u = new User();
$u->username = 'kowal';
$u->password = "kowal123";
Powiedz mi, w którym miejscu pokaże się błąd? 1, 2 czy 3? W trzecim, ponieważ tylko ta właściwość została zdeklarowana jako prywatna, i tylko ta została zdeklarowana w całej klasie jako jej! Pozostałe dwie stworzyłeś w liniach tuż pod stworzeniem nowego obiektu klasy User, czyli na poczekaniu.
Dlaczego tak? Ponieważ w konstruktorze do właściwości other przypisywana jest tablica, która nic nie wnosi. Ona jest wartością pola other, i nic więcej. Nie da się przypisać tam wartości zzewnątrz obiektu User, tak jak to rozumujesz.
Czyli idąc tym tokiem, musiałoby dać się zrobić coś takiego, by we właściwości other pod indeksem username dało się cokolwiek umieścić:
$u->other['username'] = 'kowal';
Ale tak sie nie da, ponieważ właściwość other jest właściwością prywatną.
Aby przypisac tam jaką kolwiek wartość (zwarzając, że jest to prywatna właściwość) musisz stworzyć settera lub metodę, która ustawi wartość nie koniecznie taką, jaką jej prześlesz.
Mam nadzieję, że wystarczająco wyjaśniłem to zagadnienie. Polecam czytanie dobrych artykułów, a jeśli już coś znajdziesz co ktoś inny napisał, tak jak ta 'technika' wyżej pokazana, to sprawdź, czy aby na pewno działa. Pozdrowienia, i powodzenia w nauce