login  Naam:   Wachtwoord: 
Registreer je!
 Forum

class extenden en properties (Opgelost)

Offline walldorff - 05/05/2008 22:38 (laatste wijziging 05/05/2008 22:41)
Avatar van walldorffNieuw lid Het eigenaardige doet zich voor, dat bij het extenden van een class de warde in de class variabelen niet meekomen.
Voorbeeld:

  1. class ouder {
  2. protected $id = 1; // standaard = 1
  3.  
  4. public function __construct() {
  5. $this->id = 2; // wijzig in 2
  6. $o = new kind();
  7. }
  8. }
  9.  
  10. class kind extends ouder {
  11. public function __construct() {
  12. echo $this->id;
  13. }
  14. }
  15.  
  16. $o = new ouder; // output: "Undefined property: kind::$id"


De __construct() in class kind zou toch 2 moeten geven?
Waarom is de property id in kind "undefined"?
Het maakt niet uit of de property public of protected is.

Dank,
Roland

6 antwoorden

Gesponsorde links
Offline marten - 05/05/2008 22:42
Avatar van marten Beheerder Je moet new kind dan doen he 
Offline nemesiskoen - 05/05/2008 22:50
Avatar van nemesiskoen Gouden medaille

PHP expert
2 gaat het zeker niet geven (want je maakt een tijdelijke instantie in je constructor die daarna vervalt en die niets met de huidige constructor heeft te maken), maar waarom dat het niet defined is vind ik wel vreemd.

Als je ervoor "parent::__construct" zou aanroepen zal dit wss wel 2 geven, maar dat verklaart nog altijd niet waarom hij niet gewoon 1 neemt...
Offline Stijn - 05/05/2008 22:57
Avatar van Stijn PHP expert Op localhost bij mij geeft hij 1, wat dus ook klopt (zie vage zijn uitleg).
Offline walldorff - 05/05/2008 23:20 (laatste wijziging 05/05/2008 23:32)
Avatar van walldorff Nieuw lid @marten
ik roep new kind() aan in de ouder; dit gaat dus kennelijk niet 
Heb code veranderd; zie hieronder.

@vage
klopt, waarde is 2, met de volgende code:

  1. class ouder {
  2. public $id = 1;
  3.  
  4. public function __construct() {
  5. $this->id = 2;
  6. }
  7. }
  8.  
  9. class kind extends ouder {
  10. public function __construct() {
  11. parent::__construct();
  12. echo $this->id; // output: 2
  13. }
  14. }
  15. $o = new kind();


Het probleem is eigenlijk het volgende.
Ik heb 1 ouder, met 1 of meerdere kinderen en elk kind heeft 3 of meerdere kinderen. Dus bijvoorbeeld:
1 ouder->3 kinderen->12 kleinkinderen:
- ouder->heeft 3 kinderen
- kind1->heeft 3 kinderen
- kind2->heeft 4 kinderen
- kind3->heeft 5 kinderen.

Laat ik het praktisch benoemen.
- In een taaloefening zitten oefenzinnen.
- 1 oefenzin heeft 1 of meerdere werkwoorden.
- Elk werkwoord heeft 1 goede en (pakweg) 3 foute vervoegingen
Bovenstaande komt prima uit de sql queries.
Ik begin met het fetchen van de oefenzin, ik fetch daarna de werkwoorden (met elk het goede antwoord erbij) en vervolgens de foute antwoorden.

Ik zie niet hoe ik dit anders moet doen. Wat is nu een praktische en verantwoorde manier om dit spul in objecten en sub-objecten te plaatsen? Moet ik de weg naar boven bewandelen, dus beginnen met de fouten, dan de werkwoorden en vervolgens de zin? Lijkt me niet helemaal logisch 

Thx!
Roland

PS: overigens bedenk ik me net, dat het hele feest van extenden niet doorgaat, omdat de classes Niet echt properties delen. Hooguit kan ik in de class ouder 2 properties opnemen: werkwoorden en foute_antwoorden. Die kunnen dan wel worden geërfd. In elk geval wil ik in een oefenzin het boeltje bij elkaar houden.
Offline Stijn - 06/05/2008 01:36
Avatar van Stijn PHP expert Dit lijkt me een onlogische structuur die jij voorstelt. Een zin bestaat uit woorden.

  1. class Zin
  2. {
  3.  
  4. ...
  5.  
  6. private $_woorden = array();
  7.  
  8. ...
  9.  
  10. //woordje toevoegen
  11. public function woordToevoegen( Woord w ){...}
  12.  
  13. }


Een woord kan inderdaad van alles zijn, zoals een werkwoord, lijdendvoorwerp, ... Je zou een abstract class kunnen maken. Een werkwoord kan dan bijv een child zijn van die abstract class.

  1. abstract class Woord
  2. {
  3. ...
  4. }
  5.  
  6. ...
  7.  
  8. class Werkwoord extends Woord
  9. {
  10. ......
  11. }
  12.  
  13. ...
  14.  
  15. class LijdendVoorwerp extends Woord
  16. {
  17. ...
  18. }


Als je met de properties van andere objecten wilt werken, moet je het object meegeven als parameter bij een functie in een andere class.

  1. class A
  2. {
  3. public $i = 0;
  4. }
  5.  
  6. class B
  7. {
  8. public iets( A $obj )
  9. {
  10. echo $obj->i;
  11. }
  12. }
  13.  
  14. $a = new A;
  15. $b = new B;
  16. $b->iets( $a );
Offline walldorff - 06/05/2008 02:01
Avatar van walldorff Nieuw lid Het is niet zozeer het ontleden van de zinnen, maar de spelling van bepaalde woorden. Een oefenzin ziet er alsvolgt uit:
Jan (zitten) mooi met de (bakken) peren.
De keuzen zijn dan:
> zitte-zat-zitten-zidt
> gebakte-bakken-gebak-gebakken
Jouw oplossing is perfect. Goed idee , die abstract class. Ik kan van daaruit verder werken.

Hartstikke bedankt!  
Roland
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.209s