Pole _add to ma być funkcja
Nie widzisz sprzeczności w tym zdaniu?
Pole
ma być funkcją
?
Rozpatrzmy następujący kod:
class SomeClass {
/**
* @var int
*/
private $id;
/**
* Ustawia indeks na wskazaną wartość.
* @param int $v
* @return $this
* @throws Exception
*/
public function setId($v) {
if (!ctype_digit($v)) {
throw new Exception('Oczekiwano indeksu w formie liczby.');
}
$this->id = $v;
return $this;
}
/**
* Zwraca ustawiony indeks.
* @return int
*/
public function getId() {
return $this->id;
}
}
Sporo się tutaj dzieje, więc na początek:
-
id
to pole (dodatkowo prywatne - pola generalnie powinny być prywatne, patrz: hermetyzacja
, kapsułkowanie
). Niektórzy lubią takie prywatne pola nazywać z przedrostkiem _
, np. _id
, ale kto co lubi.
-
setId
oraz getId
to metody.
Tutaj fachowo setId
to setter (jako że jedynie ustawia wartość pola), a getId
to getter (jako że jedynie zwraca wartość pola).
Każde pole, które ma być modyfikowalne z zewnątrz klasy, powinno mieć swój odpowiadający prosty setter oraz getter. "Prosty", czyli że setter
nie powinien robić nic więcej poza ewentualną walidacją oraz zmianą wartości danego pola, a getter
powinien jedynie zwracać wartość pola.
Ponadto wykonując return $this;
w setterze umożliwiłem method chaining, czyli że gdyby było w moim obiekcie więcej setterów, można by było z mety napisać:
$obj->
setFirstName('Jan')->
setLastName('Kowalski')->
setPrivatePartSize(30)->
save();
Zamiast:
$obj->setFirstName('Jan');
$obj->setLastName('Kowalski');
$obj->setPrivatePartSize(30);
$obj->save();
Jest to bardzo popularna technika, z którą jeśli jeszcze się nie spotykasz, to zaczniesz na co dzień np. w Zendzie oraz innych frameworkach/kodach.
Dodatkowo dla smaczku pododawałem do każdej metody oraz pola komentarze PHPDoc, czyli opisy zwiększające czytelność kodu oraz umożliwiające środowisku sensowne podpowiadanie. Może akurat tutaj niewiele pomagają (w końcu setId
jest dosyć jednoznaczne - ale czasem są niezbędne, np. jakieś setLength
, gdzie w komentarzu do metody wypadałoby sprecyzować, czy metoda przyjmuje centymetry, metry czy kilometry).
Jako początkujący niekoniecznie musisz okomentowywać wszystko czy też odnajdywać się w tych wszystkich tagach dokumentatora, natomiast warto wiedzieć, że coś takiego istnieje.
^ tutaj masz przedstawione sporo wiedzy, która powinna Ci pomóc w pisaniu bardziej przejrzystego kodu - na spokojnie sobie wszystko przetwórz i zadawaj pytania, jeśli czegoś nie rozumiesz ;)
W Twoim konkretnym przypadku optowałbym za utworzeniem klasy `Player` z prywatnymi polami `login`, `password`, ich getterami+setterami oraz metodą `save`, która to dopiero wykonywałaby zapytanie do bazy danych. Wtedy wszystko byłoby jednoznaczne oraz ładnie łączyło w całość :-)
Plus dodatkowo statyczna klasa Database
, dzięki której mógłbyś wykonywać zapytania na zasadzie Database::prepareQuery('SELECT ...');
.
W związku z bazami danych, poczytaj o PDO - ułatwisz życie sobie oraz innym, jednocześnie zabezpieczając swój kod przed atakami typu sql injection.