[php] variables uit parent class gebruiken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Ik ben bezig met een framework te schrijven en heb dus een soort van 'hoofdclass' gemaakt die ik kernel noem. Daar wordt het rechtensysteem en de database connectie gezet in een variable in die class ($this->dbconn en $this->users). Nu had ik dus uit de class die zit in $this->users graag de class die zit in $this->dbconn (van kernel dus). Momenteel ziet 't er ongeveer zo uit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
class kernel
{
var $users;
var $dbconn;
function kernel
{
// ...
$this->dbconn = new dbconn;
// ...
$this->users = new users;
// ...
}
}

class users extends kernel
{
function users
{
$dbres = $this->dbconn->RecordSet("SELECT * FROM users WHERE username='{$_SESSION['username']}' AND password='{$_SESSION['password']}'");
// ...
}
}

class dbconn
{
// ...
}
?>


Dit werkt dus niet... Die $this->dbconn bestaat gewoon niet in die class...

Op php kwam ik parent tegen maar dat kan je enkel gebruiken om een functie uit de parent class aan te roepen. Weet iemand hoe ik dat toch kan doen?

[ Voor 11% gewijzigd door dingstje op 17-08-2003 16:31 ]

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 13:29
In de constructor van users moet je de constructor van kernel aanroepen. En dat doe je met parent::kernel().

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

het netste is IMO om een returnInstance functie in de kernel class te maken die dit:
PHP:
1
2
3
function returnInstance(){
return $this;
}
doet :)
deze kun je dan met
PHP:
1
parent.returnInstance()
aanroepen :)

Ik heb me nooit zo verdiept in PHP en OOP; dus de syntax kan niet geheel correct zijn

[ Voor 19% gewijzigd door Spider.007 op 17-08-2003 16:37 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Sjaaky schreef op 17 August 2003 @ 16:35:
In de constructor van users moet je de constructor van kernel aanroepen. En dat doe je met parent::kernel().
Dan krijg ik toch een eindeloze loop? Ik roep de functie kernel aan waarin de class users gemaakt wordt waarin de functie kernel weer wordt aangeroepen...

Ik ga eens kijken voor de oplossing van Spider.007

Bedankt allesinds voor de reacties :-)

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 13:29
Tja daar heb je gelijk in.
Het probleem wat je hebt is een beetje een raar classmodel. users extends kernel wat je denk ik eigenlijk niet wil.
Je kan dan beter zoiets doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
class kernel
{
var $users;
var $dbconn;
function kernel()
{
// ...
$this->dbconn = new dbconn;
// ...
$this->users = new users;
// ...
}
}

class users
{
var $kernel;
function users($kernel)
{
$this->kernel = &$kernel;
$dbres = $this->kernel->dbconn->RecordSet("SELECT * FROM users ...");
// ...
}
}

class dbconn
{
// ...
}
?>


Met het doorgeven van objecten als parameter van methoden moet je wel onwijs oppassen in php. Voor je het weet heb je een kopie van het origineel te pakken ipv een reference naar het origineel.

[ Voor 17% gewijzigd door Sjaaky op 17-08-2003 17:09 ]


Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
hm... als ik dan print_r($this->kernel) doe dan zit daar niks in, terwijl als ik in de class kernel print_r($this) doe ik alle variablen uit die class krijg, inclusief de variablen uit de class dbconn.

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Je moet dan ook doen.
PHP:
1
$this->users = new users($this);

Dus even $this meegeven bij het aanmaken van de instantie van users. Dat is wat er mist bij de post van Sjaaky. Voor de rest klopte het wel.
In de constructor van de users class doe je het volgende.
PHP:
1
2
3
4
function users ($kernel)
{
    $this->kernel =& $kernel
}

Binnen de users class kan je dan als volgt gebruik maken van je DB class.
PHP:
1
    $dbres = $this->kernel->dbconn->RecordSet("je query...........");

[ Voor 55% gewijzigd door Brakkie op 23-08-2003 10:09 ]

Systeem | Strava

Pagina: 1