25 października
Obiektowość - rozwiązania
Znowu lekki poślizg względem planów, ale ważne, że nie dłużej niż tydzień :) Zaczynamy z rozwiązaniami. Pierwsze zadanie było banalne, ale trzeba było mieć podstawę do tego, żeby zacząć robić trudniejsze zadania. Pierwsze zadanie mogło wyglądać tak:
{
private $a;
private $b;
public $c;
public function __construct ($a=0,$b=0,$c=0)
{
$this->a=(int)$a;
$this->b=(int)$b;
$this->c=(int)$c;
}
}
Stworzyliśmy klasę o nazwie jeden. Klasę oczywiście zapisujemy w pliku o nazwie jeden.php . Proste i logiczne, a później ułatwi pewną rzecz. Klasa ma 3 pola, z czego dwa prywatne. W konstruktorze ustawiamy wartości pól. Jeśli nie podamy wartości pól, będą nimi wartości domyślne (w tym wypadku zero). W identyczny sposób tworzymy drugą klasę o nazwie dwa (lub jakiej kto woli, np. super_hiper_nic_nie_robiaca_klasa).
return $this->a;
public function pokaz_b();
return $this->b;
public function pokaz_c()
return $this->c;
Tak mogą wyglądać metody zwracające wartości pól. Mogą bo oczywiście jest milion różnych sposobów żeby to zrobić. A po co w ogóle zwracamy te wartości? Ponieważ nie można się do nich dostać z poza klasy. Kod inicjujący obiekt tej klasy oraz wyświetlający pola wygląda np. tak:
include ("klas/$nazwa_klasy.php");
$obiekt_jeden = new jeden(4,5,6);
echo 'wartosc a pierwszego obiektu = '.$obiekt_jeden->pokaz_a().'<br />';
echo 'wartosc b pierwszego obiektu = '.$obiekt_jeden->pokaz_b().'<br />';
echo 'wartosc c pierwszego obiektu = '.$obiekt_jeden->pokaz_c().'<br />';
Co do wyświetlania zmiennych nie ma chyba problemu. Na początku “użyłem” funkcji __autoload. Jeśli nie dołączymy do skryptu odpowiednich plików z klasami, funkcja ta będzie wtedy wywoływana. Będzie próbowała otworzyć plik z klasą (dlatego ważne było nazywanie plików tak jak nazwa klasy). Funkcja działa trochę dłużej niż zwykłe includowanie plików, jednak nie zawsze wszystkie z nich są potrzebne - oszczędzamy w ten sposób pamięć serwera. Dokładnie w ten sam sposób robimy z drugą klasą.
I ostatnie zadanie. Przed napisaniem właściwej metody, należy napisać metody pomocnicze. Będą one zmieniać wartość pól - w ten sposób będzie można je zmienić pomimo tego, że są to pola prywatne.
$this->a=(int)$a;
public function ustaw_b($b)
$this->b=(int)$b;
public function ustaw_c($c)
$this->c=(int)$c;
I metoda właściwa.
{
if($this->b==0)
return false;
$ob->ustaw_a(($ob->pokaz_a()+$this->a)/$this->b);
$ob->ustaw_b(($ob->pokaz_b()+$this->a)/$this->b);
$ob->ustaw_c(($ob->pokaz_c()+$this->a)/$this->b);
return true;
}
Jak widać, w przypadku kiedy miałoby nastąpić dzielenie przez zero (wartość pola b==0), zostaje zwrócone false. Jest to najprostsza obsługa wyjątku. Przy wywołaniu tej metody sprawdzamy czy wartość jest false - jeśli tak, to wypisujemy komunikat o tym, że operacja się nie udała. Można oczywiście rzucić też wyjątkiem:
Jest to wygodniejsze. Dlaczego? Już niedługo o tym napiszę. To na razie wszystko. Jeśli są jakieś pytania - zadawajcie je w komentarzach.

Autor: Paweł dnia 25.10.09 o godz. 17:11
Witam
Mam takie pytanie, czy będziesz kontynuował pisanie gry rpg? I czy będzie to w formie tutorialu?
Poza tym, czy uczyłeś się już pisać takie gry, czy dopiero eksperymentujesz? ew. skąd bierzesz materiały, jakieś sugestie książek?
Autor: misiuziu dnia 25.10.09 o godz. 17:11
Tak, będę kontynuował. Jednak nie da się jej napisać bez przekazania podstaw. I owszem, będzie to w formie tutorialu.
Uczyłem się PHP pisząc podobną grę. Teraz mam zamiar napisać ją od nowa w ramach treningu - krok po kroku ja tutaj opisując. Zakładam, że za parę postów będzie można wziąć się za właściwe pisanie.
Co do książek to polecam wydawnictwo Helion. Ogólnie mają ciekawe książki. Sam obecnie czytam tą książkę . Można je dostać w empiku, ale przez neta wychodzi taniej.