Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Obiekt gracza
Salur
post 8.08.2015, 13:48:47
Post #1





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 28.12.2014

Ostrzeżenie: (20%)
X----


witam, tworzę obiekt gracza (wszystkie dane uzytkownika) z którego zmiennych będę korzystał w całej grze.

Teraz pytanie, zrobiłem aby wyswietlało w tablicy czyli cos takiego:

  1. $gracz = array('level' => 1, name = 'Salur'); itd.


Teraz problem w tym że nie wiem jak z takiego obiektu dalej korzystac we wszystkich plikach. Mam umieścić go w jednym pliku i includować do każdego?

I teraz drugi, jak mam we wszystkich plikach z tego korzystac? tak?

  1. $gracz['level'] itd?
Go to the top of the page
+Quote Post
Skie
post 8.08.2015, 15:56:16
Post #2





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


Przede wszystkim to tablica array nie jest obiektem. Jest milion sposobów w jaki możesz to zrobić, z czego najlepiej będzie zrobić to w taki sposób, że:

1. Stwórz klasę PlayerModel, która jest modelem gracza. W Twoim przykładzie byłoby to coś w stylu:

  1. class PlayerModel
  2. {
  3. protected $level;
  4. protected $name;
  5.  
  6. // dodatkowe pola
  7.  
  8. public function __construct(array $rawPlayerData = [])
  9. {
  10. $this->level = isset($rawPlayerData['level']) ? $rawPlayerData['level'] : 0;
  11. $this->name = isset($rawPlayerData['level']) ? $rawPlayerData['level'] : '';
  12. }
  13.  
  14. // tutaj jakieś dodatkowe settery, gettery
  15. }


2. Stwórz fabrykę graczy, która będzie zajmowała się tworzeniem PlayerModel korzystając z jakiejś bazy graczy - np. MySQL

  1. class PlayerFactory
  2. {
  3. // ...
  4.  
  5. public function createPlayer($id)
  6. {
  7. // $this->storage to handler to klasy, która zajmuje się połączeniem z Twoim storage - może to być to PDO dla MySQL albo jakiś ORM albo cokolwiek używasz
  8. $data = $this->storage->getPlayerData($id)->fetchArray();
  9.  
  10. return new PlayerModel($data);
  11. }
  12.  
  13. // ...
  14. }


3. Teraz wszędzie, gdzie chcesz skorzystać stworzyć PlayerModel(), możesz użyć coś takiego:

  1. $factory = new PlayerFactory(...);
  2. $player = $factory->createPlayer($playerID);


4. W funkcjach metodach, gdzie chcesz użyć tego modelu z kolei możesz go hintować:

  1. public function doSomethingToPlayer(PlayerModel $player)
  2. {
  3. $player->doSomething();
  4. }


5. W razie rozwoju projektu, możesz fabrykę graczy umieścić wewnątrz Dependency Injection Containera.


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
Salur
post 8.08.2015, 20:09:05
Post #3





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 28.12.2014

Ostrzeżenie: (20%)
X----


Hmm kilka pytan mam:

1.

  1. $data = $this->storage->getPlayerData($id)->fetchArray();
  2.  
  3. //
  4. w którym momecie definiuje połączenie z baza?
  5. i czy muszę w tym miejscu co kod wyzej zdefiniować wszystkie zmienne? tzn.
  6. //
  7.  
  8. $data = $this->storage->getPlayerData($id)->fetchArray();
  9. $data = $this->storage->getPlayerData($name)->fetchArray();
  10.  
  11. itd.

2. Piszesz że do wyświetlania używam tego, lecz powiedz mi jeszcze czy ja muszę zawartosc tego wszystkiego tego całego kodu umieścić po załadowaniu gry tak? I móglbyś podać przykład wyswietlanie np. id gracza w jakims pliku np?

  1. $factory = new PlayerFactory(...);
  2. $player = $factory->createPlayer($playerID);


3. Gdzie w tym kodzie całym umieszczę zapytanie z użyciem sesii w której mam zapisane id gracza.

Z góry dziękuję za odpowiedz.
Go to the top of the page
+Quote Post
Skie
post 8.08.2015, 20:33:58
Post #4





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


Uchwyt do storage powinien być zdefiniowany jako Dependency klasy PlayerFactory.

  1. class PlayerFactory
  2. {
  3. protected $storage = null;
  4.  
  5. // ...
  6.  
  7. public function __construct(Storage $storage)
  8. {
  9. $this->storage = $storage;
  10. }
  11.  
  12. public function createPlayer($id)
  13. {
  14. // $this->storage to handler to klasy, która zajmuje się połączeniem z Twoim storage - może to być to PDO dla MySQL albo jakiś ORM albo cokolwiek używasz
  15. $data = $this->storage->getPlayerData($id);
  16.  
  17. return new PlayerModel($data);
  18. }
  19.  
  20. // ...
  21. }


Następnie wywołanie tego kodu w jakimś miejscu wyglądało by tak:

  1. $session = new Session(); // jakiś obiekt, którym zarządzasz sesją
  2. $storage = new Storage(); // jakiś obiekt, którym zarządzasz magazynem danych - innymi słowy to ta klasa powinna być świadoma o obiekcie $db, który trzyma połączenie do bazy danych
  3. $factory = new PlayerFactory($storage); // fabryka graczy
  4.  
  5. $player = $factory->createPlayer($session->getId()); // za pomocą fabryki tworzysz obiekt klasy PlayerModel, który zawiera WSZYSTKIE dane odnośnie gracza. Zauważ, że ID przekazane do createPlayer() pobrałeś od obiektu Session(), który potrafi operować na sesji
  6.  
  7. echo $player->getId(); // zwraca Id gracza
  8. echo $player->getName(); // zwraca name gracza
  9. echo $player->getLevel(); // zwraca poziom gracza
  10. // itd./


Wszystkie gettery które użyłem na $player, oczywiście musisz zdefiniować wewnątrz klasy PlayerModel. Połaczenie z bazą danych powinno być zdefiniowane gdzieś wewnątrz klasy Storage, czyli np.:

  1. class Storage {
  2. protected $db = null;
  3.  
  4. public function __construct()
  5. {
  6. $this->db = new PDO(...);
  7. }
  8.  
  9. public function getPlayerData($id) // zauważ, że własnie tę metodę wykorzystuje metoda PlayerFactory::createPlayer() do pobrania danych
  10. {
  11. $stmt = $this->db->prepare("SELECT * FROM players WHERE id=:id");
  12. $stmt->bindValue(':id', $id, PDO::PARAM_INT);
  13. $stmt->execute();
  14.  
  15. return $stmt->fetch(PDO::FETCH_ASSOC);
  16. }
  17. }


Pamiętaj , że obiekt klasy Storage() powinieneś stworzyć RAZ na całą swoją aplikację i następnie wstrzykiwać tam gdzie jest Ci potrzebny, by nie tworzyć zbędnych połączeń do bazy danych. Oczywiście jest to bardzo prosta implementacja takiego magazynu danych. Wraz ze wzrostem wiedzy, wyabstraktujesz tę klasę do masy innych podklas.

Ten post edytował Skie 8.08.2015, 20:38:48


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 23:34