login  Naam:   Wachtwoord: 
Registreer je!
 Forum

$this in de class van de extended veranderen.. (Opgelost)

Offline Nrzonline - 07/01/2008 20:39 (laatste wijziging 07/01/2008 20:39)
Avatar van NrzonlinePHP ver gevorderde beste,

sorry voor de wat (misschien heel erg) vage titel. Maar ik kon er niet iets veel beters van maken. Misschien weer zo'n simpel vraagje, maar ben na veel gekloot beetje de weg kwijt.. (je hebt van die momenten..)

Maar ik heb het volgende probleem in een klasse:

ik heb de class PlayQuest en die extends de class Quest.
  1. <?PHP
  2. class PlayQuest extends Quest
  3. {
  4. var $iPart;
  5.  
  6. public function aanpassen ()
  7. {
  8. parent::wijzigen (3); #Quest::wijzigen ();
  9. }
  10. }
  11. ?>


Nou wil ik dat hij in de class Quest de var $iPart gaat aanpassen.

  1. <?PHP
  2.  
  3. class Quest
  4. {
  5. public function wijzigen ($iPart)
  6. {
  7. #de $iPart var van de PlayQuest class moet hier dus naar 3 worden veranderd. (de megegeven parameter)
  8. }
  9. }
  10.  
  11. ?>


weet iemand hoe?

bij voorbaat, dank
nrzonline

9 antwoorden

Gesponsorde links
Offline Wim - 07/01/2008 20:50 (laatste wijziging 07/01/2008 20:52)
Avatar van Wim Crew algemeen
  1. class PlayQuest extends Quest
  2. {
  3. var $iPart;
  4.  
  5. public function __construct()
  6. {
  7. parrent::playQuest = $this;
  8. }
  9. }
  10.  
  11. class Quest
  12. {
  13. var $playQuest = NULL
  14.  
  15. public function plusone()
  16. {
  17. $this->playQuest->iPart++;
  18. }
  19. }


zoiets?

//edit:
even voorbeeld met iPart toegevoegd
Offline Stijn - 07/01/2008 20:52
Avatar van Stijn PHP expert Slechte class ontwerp. Je kan moeilijk een child eigenschap aanpassen. Je moet die eigenschap meegeven aan je Quest class of de functie aanpassen() moet zelf die eigenschap aanpassen.

Waarom roep je parent::functie() op? Gebruik toch gewoon $this->functie() voor non-static functies.
Offline Nrzonline - 07/01/2008 21:20
Avatar van Nrzonline PHP ver gevorderde @wim,

Hmz, het probleem is dat ik een waarde wil mee geven zoals in een functie. Vanuit die functie moet hij de $this var in PlayQuest aanpassen. Maar ik merk al dat dit dus niet mogelijk is zonder eerst te doen wat jij net zegt. Maar ik hoopte het zo kort mogelijk te maken door mijn gedachte, maar aangezien dat niet mogelijk is, zal het wel moeten zoals ik het nu heb om het zo kort en toch efficient te houden..

@stijn,

er zullen bijv. 100 quests zijn, die allemaal dezelfde functies gebruiken die zich bevinden in de Quest class.
Offline Stijn - 07/01/2008 21:38
Avatar van Stijn PHP expert Zet die eigenschap bij de parent en ook die methode ipv bij de childs.
Offline Grayen - 07/01/2008 21:40 (laatste wijziging 07/01/2008 21:54)
Avatar van Grayen PHP ver gevorderde Je zal meer zo moeten denken lijkt me:

  1. <?php
  2. class Quest
  3. {
  4. public function plusOne($iNumber)
  5. {
  6. return ++$iNumber;
  7. }
  8. }
  9.  
  10. class PlayQuest extends Quest
  11. {
  12. public $iPart = 0;
  13.  
  14. public function __construct()
  15. {
  16. $this->iPart = $this->plusOne($this->iPart);
  17. }
  18. }
  19. ?>


Edit:

@stijn
Dat is nog beter, zolang deze variables in elke quest hetzelfde zijn.

Edit:

En als je in alle quest telkens een groot deel van de functies hetzelfde zal hebben zal ik met abstracte classes gaan werken, bijvoorbeeld zoiets:

  1. <?php
  2. abstract class Quest
  3. {
  4. public $iPart = 0;
  5.  
  6. public function __construct()
  7. {
  8. $this->plusOne();
  9. }
  10.  
  11. public function plusOne()
  12. {
  13. ++$this->iPart;
  14. }
  15.  
  16. abstract public function doQuest();
  17. }
  18.  
  19. class QuestOne extends Quest
  20. {
  21. public $bKilledTheBadGuy = false;
  22.  
  23. public function doQuest()
  24. {
  25. if (rand(0, 10) > 5)
  26. {
  27. $this->bKilledTheBadGuy = true;
  28. }
  29. }
  30. }
  31.  
  32. class QuestTwo extends Quest
  33. {
  34. public $bSafedTheWorld = false;
  35.  
  36. public function doQuest()
  37. {
  38. if (rand(0, 20) > 10)
  39. {
  40. $this->bSafedTheWorld = true;
  41. }
  42. }
  43. }
  44. ?>
Offline Stijn - 07/01/2008 22:03
Avatar van Stijn PHP expert Voor je script moet je weten welke classes je gaat schrijven. Iedere class heeft eigenschappen en de methoden werken met die eigenschappen (al dan niet overge-erft van hogere classes).

Over je class is niet veel nagedacht want een parent kan een eigenschap van de child niet aanpassen. Het kan maar dan is je class slecht ontworpen.
Offline ikkedikke - 08/01/2008 10:39
Avatar van ikkedikke PHP expert hee als je er gewoon een protected variable van maakt is er toch niks aan de hand?
dan moet je het gewoon in de childklasse aan kunnen passen.
Daar is heel dat gedoe voor in de wereld geholpen.
Offline Nrzonline - 10/01/2008 10:48
Avatar van Nrzonline PHP ver gevorderde Ik heb alles een aantal keer doorgelezen en meer informatie en voorbeelden over opgezocht. Interessant, maar nog best lastig omdat ik nog niet zo heel lang bezig met OOP. Maar toch heeft me dit al veel geholpen maar de echte oplossing heb ik nog niet gevonden, daarvoor moet ik namelijk veel om gooien. Vandaar dat ik ga prutsen met het ontwikkelen met een systeem die nog niet wordt geimplementeerd in het spel zelf.

Dus ik ga het helemaal opnieuw scripten zodat alles beter in elkaar steekt. Dus allemaal bedankt voor jullie suggesties en opmerkingen! (k) 
Offline Wim - 10/01/2008 18:00
Avatar van Wim Crew algemeen hier is mss een voorbeeldje, untested maar ik vertrouw erop dat het werkt 
  1. <?php
  2. abstract class questBase
  3. {
  4. private $iPart = 0;
  5. private $missions = array();
  6.  
  7. public function plus ($i=1)
  8. {
  9. $this->iPart += $i;
  10. }
  11.  
  12. public function part ($i=NULL)
  13. {
  14. if(!is_numeric($i))
  15. {
  16. return $this->iPart;
  17. }
  18. else
  19. {
  20. $this->iPart = $i;
  21. return true;
  22. }
  23. }
  24.  
  25. public function mission ($mission)
  26. {
  27. return $this->missions[$mission];
  28. }
  29. }
  30.  
  31. class quest extends questBase
  32. {
  33. //.....
  34. public function quest ()
  35. {
  36. $this->plus(2); // 2 bij iPart bijtellen
  37. }
  38. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.25s