[PHP] Functies tussen child classes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 15-09 23:41
Vanuit een main class include ik 2 child classes. De child classes moeten ook elkaars functies kunnen aanroepen. Om de een of andere reden krijg ik dit niet werkend.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class main {
   __construct() {
      $this->error = new error();
      $this->db = new db();
   }
}

class error extends main {
   public function kill() {
      echo('kill app');
   }
}

class db extends main {
   __construct() {
      //mysqli connect
      if (!connectie) {
         $this->error->kill();
      }
   }
}


Dit levert de volgende errors op:
Notice: Undefined property: db::$error
Fatal error: Call to a member function kill() on a non-object

Ik heb vanalles geprobeerd met parent::, $this, abstract class, implements etc. Ik heb ook gelezen over singletons maar dit is niet wat ik wil.

Kan iemand mij uileggen waarom het niet werkt?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Binnen welke scope heb je $db gedeclareerd in main? Public, private of protected? Anders kijk ik even naar de code in plaats van alleen naar de melding. :P

[ Voor 37% gewijzigd door NMe op 30-11-2009 00:52 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat jij nodig hebt is een cursus OO, want hier klopt natuurlijk niets van :). error en db extenden van main. Dat wil zeggen dat zij subclasses zijn, oftewel, db en error zijn specifiekere varianten van main. Bijvoorbeeld een Hond en een Kat zijn beiden een Dier.

Welnu, de manier waarop jij het gebruikt is, om de dier analogie aan te houden, dat jij een klasse Hond hebt gemaakt. En een hond heeft natuurlijk 4 poten, dus heb je ook een Poot klasse die je 4x instantieert. Maar dat niet alleen, je maakt die Poot ook een subclass van Hond. Ik hoop dat het nu ook voor jezelf duidelijk is dat dat laatste natuurlijk gewoon niet klopt. Een poot is geen hond.

Verder moet je je beseffen dat de error en db die je maakt in main aparte instanties zijn. Zij hebben dus ook hun eigen $this pointer die naar henzelf wijst. Als je vanuit db bij main of bij de error van main wilt komen, zul je bij het aanmaken van db een referentie moeten meegeven naar die error of main. De instantie van db kan dit dan in $this opslaan, zodat hij er later bij kan.

.edit: en eigenlijk heb je hier trouwens mazzel dat PHP niet standaard de constructor van de superclass aanroept, anders had je een mooie infinite loop.

[ Voor 6% gewijzigd door .oisyn op 30-11-2009 00:41 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Uiteraard heeft .oisyn gelijk 8-). Verder is deze syntax ook onjuist:

PHP:
1
if (!connectie) {


Er moet sowieso nog een $ voor connectie en je definieert die variabele ook helemaal nergens.

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

HuHu schreef op maandag 30 november 2009 @ 08:52:
Uiteraard heeft .oisyn gelijk 8-). Verder is deze syntax ook onjuist:

PHP:
1
if (!connectie) {


Er moet sowieso nog een $ voor connectie en je definieert die variabele ook helemaal nergens.
PHP:
1
define('connectie', $db_conn);

:Y)

Even zonder ongein, object orientation 101 kan geen kwaad...

[ Voor 7% gewijzigd door prototype op 30-11-2009 09:00 ]


Acties:
  • 0 Henk 'm!

  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 15-09 23:41
HuHu schreef op maandag 30 november 2009 @ 08:52:
Uiteraard heeft .oisyn gelijk 8-). Verder is deze syntax ook onjuist:

PHP:
1
if (!connectie) {


Er moet sowieso nog een $ voor connectie en je definieert die variabele ook helemaal nergens.
Dat weet ik ook wel, maar daar gaat het niet om.
In ieder geval bedankt voor het inzicht in honden/katten :-),

Ik heb verschillende OOP 101's/tutorials gedaan en een eenvoudige class opzetten lukt wel. Zodra ik meerdere classes met elkaar wil laten werken loop ik tegen problemen aan zoals je ziet. Weet iemand toevallig een tutorial die (ongeveer) beschrijft wat ik wil doen/kan iemand uitleggen hoe het wel zou moeten?

Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 14:32

--MeAngry--

aka Qonstrukt

Nou, je DB extend wel van Main, maar je voert alleen de __construct() van DB uit. Als je vervolgens ook de __construct() van Main uit wil voeren, moet je die zelf aanroepen met parent::__construct().

Als je jezelf echter voldoende in had gelezen in PHP OO, had je dit wel geweten. ;) Sowieso is deze opzet inderdaad fout, zoals al aangegeven.

Begin hier alleen al eens: http://nl2.php.net/manual/en/language.oop5.php

En over je specifieke probleem: http://nl2.php.net/manual...ge.oop5.decon.constructor

Belangrijkste is dat je hiervan leert dat het niet alleen belangrijk is om te weten hoe je iets schrijft, maar dat je ook goed snapt waar je het voor gebruikt en hoe je het toepast. Dat is minstens even belangrijk.

[ Voor 38% gewijzigd door --MeAngry-- op 30-11-2009 10:12 ]

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Beginnen met het niet extenden van classes die by design best wel final behoren te zijn (afgaande op jouw versimpelde code) lijkt me een goeie start. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

--MeAngry-- schreef op maandag 30 november 2009 @ 10:09:
Nou, je DB extend wel van Main, maar je voert alleen de __construct() van DB uit. Als je vervolgens ook de __construct() van Main uit wil voeren, moet je die zelf aanroepen met parent::__construct().
Zoals ik al zei, als je dat doet krijg je een infinite loop.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

.oisyn schreef op maandag 30 november 2009 @ 11:33:
[...]

Zoals ik al zei, als je dat doet krijg je een infinite loop.
Nee een infinite nesting, en dus een stack overflow. Een true infinite loop breekt niet :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

De code loopt. Dat daarbij je stack opblaast doet er niet zoveel toe, dat kan in for-loopje ook ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Ik heb door de jaren heen genoeg code moeten debuggen waarbij ik god smeekte of iedere infinite loop ajb uit zichzelf snel en helder kon termineren :+

Professionele website nodig?

Pagina: 1