Warning: Cannot modify header information - headers already sent by (output started at /homez.318/rsdownlo/www/kursphp/wp-config.php:1) in /homez.318/rsdownlo/www/kursphp/wp-content/plugins/ozh-who-sees-ads/wp_ozh_whoseesads.php on line 620

Warning: Cannot modify header information - headers already sent by (output started at /homez.318/rsdownlo/www/kursphp/wp-config.php:1) in /homez.318/rsdownlo/www/kursphp/wp-content/plugins/ozh-who-sees-ads/wp_ozh_whoseesads.php on line 621
Obiektowość - rozwiązania | Kurs PHP - stwórz MMORPG

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:

class jednej
{
    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).

public function pokaz_a()
    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:

function __autoload($nazwa_klasy)
    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.

public function ustaw_a($a)
    $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.

public function zmien(jeden $ob)
{
    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:

throw new Exception ("Nie udało się wykonać operacji. Błąd dzielenia przez zero.", 001);

Jest to wygodniejsze. Dlaczego? Już niedługo o tym napiszę. To na razie wszystko. Jeśli są jakieś pytania - zadawajcie je w komentarzach.

Odpowiedzi: 2 do tego wpisu.

  1. Paweł's Gravatar

    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?

  2. misiuziu's Gravatar

    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.

Dodaj swój komentarz