Klasses linken lukt niet goed
Fatal error: Call to undefined method a::d()
Code (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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class a
{
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
$var = $msg . "2e berichtje erbij";
$this->d($var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
}
}
class b
{
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
a::c($msg)
}
}
?>
class a
{
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
$var = $msg . "2e berichtje erbij";
$this->d($var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
}
}
class b
{
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
a::c($msg)
}
}
?>
In wat voor toepassing wil je dit plaatsen, want de gedachte achter dit voorbeeld is in ieder geval niet correct. Als je in b bepaalde methods van a wilt gebruiken, maak dan een instantie van a aan en ga daarmee aan de slag. Dus iets als:
Code (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
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 a {
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
if(!empty($msg)) {
$this->var = $msg;
} else {
$this->var = 'leeg waarde';
}
$this->d($this->var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
return 'bericht: '.$msg;
}
}
class b extends a {
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
parent::c($msg);
}
}
$ff = new b();
echo $ff->c('');
echo $ff->e('bericht2');
?>
class a {
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
if(!empty($msg)) {
$this->var = $msg;
} else {
$this->var = 'leeg waarde';
}
$this->d($this->var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
return 'bericht: '.$msg;
}
}
class b extends a {
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
parent::c($msg);
}
}
$ff = new b();
echo $ff->c('');
echo $ff->e('bericht2');
?>
Is niet getest, dus er kunnen fouten inzitten..
Edit:
Blanches voorbeeld is toch wat beter :P:
Code (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
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
<?php
class a {
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
if(!empty($msg)) {
$this->var = $msg;
} else {
$this->var = 'leeg waarde';
}
$this->d($this->var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
return 'bericht: '.$msg;
}
}
class b {
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
$a = new a;
$a->c($msg);
}
}
$ff = new b();
echo $ff->e('');
echo $ff->e('bericht2');
?>
class a {
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
if(!empty($msg)) {
$this->var = $msg;
} else {
$this->var = 'leeg waarde';
}
$this->d($this->var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
return 'bericht: '.$msg;
}
}
class b {
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
$a = new a;
$a->c($msg);
}
}
$ff = new b();
echo $ff->e('');
echo $ff->e('bericht2');
?>
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
edit: en die 2e klasse is een user klasse en die mag je volgens OOP niet extenden met database klasse zo ver ik heb gelezen en gezien.
Gewijzigd op 01/01/1970 01:00:00 door mitchel
Hoe kan je dit oplossen? Door in functie c "$this->d($var)" te vervangen door "self::d($var)". Nu roept hij functie d uit klasse a aan!
Succes :)
mitchel schreef op 16.06.2009 12:24:
Dan gebruik je dus een instantie van je database klasse in je user klasse en niet andersom.Ik heb nu dus een database klasse die ik ook in een andere klasse wil gebruiken en ik wilde precies weten hoe ik dit dus goed kon doen.
@Peter: extenden mag alleen als je kunt zeggen 'b is een a', dus bijvoorbeeld 'kerk is een gebouw'. In alle andere gevallen kun je een klasse niet extenden...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Peter schreef op 16.06.2009 12:23:
Je code zou zo wel moeten werken trouwens:
Is niet getest, dus er kunnen fouten inzitten..
Code (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
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
<?php
class a {
var $var;
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
if(!empty($msg)) {
$this->var = $msg;
} else {
$this->var = 'leeg waarde';
}
$this->d($this->var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
echo 'bericht: '.$msg.'<br>';
}
}
class b extends a {
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
parent::c($msg);
}
}
$ff = new b();
echo $ff->c('');
echo $ff->e('bericht2');
?>
class a {
var $var;
public function c($msg) {
// hier wil ik een bericht doorsturen naar class a function d
if(!empty($msg)) {
$this->var = $msg;
} else {
$this->var = 'leeg waarde';
}
$this->d($this->var);
}
public function d($msg) {
// hier doe ik dan wat met het bericht
echo 'bericht: '.$msg.'<br>';
}
}
class b extends a {
public function e($msg) {
// hier wil ik een bericht doorsturen naar class a function c
parent::c($msg);
}
}
$ff = new b();
echo $ff->c('');
echo $ff->e('bericht2');
?>
Is niet getest, dus er kunnen fouten inzitten..
Misschien een beetje offtopic, maar wel belangrijk vind ik.
In een class function doe je geen echo, daar doe je een return, je wilt met de waarde kunnen werken. Misschien wil je er wel sprintf o.i.d. over gooien. Verder gebruik je var, dat komt van php4. Php 4 heeft in vergelijking met php 5 slechte OOP ondersteuning.
ik zal je tips onthouden
Blanche schreef op 16.06.2009 12:27:
@Peter: extenden mag alleen als je kunt zeggen 'b is een a', dus bijvoorbeeld 'kerk is een gebouw'. In alle andere gevallen kun je een klasse niet extenden...
Dus het is nodig om eerst aan te duiden a = new a(); voordat ik de functie kan gebruiken of snap ik het nu helemaal verkeerdmitchel schreef op 16.06.2009 12:24:
Dan gebruik je dus een instantie van je database klasse in je user klasse en niet andersom.Ik heb nu dus een database klasse die ik ook in een andere klasse wil gebruiken en ik wilde precies weten hoe ik dit dus goed kon doen.
@Peter: extenden mag alleen als je kunt zeggen 'b is een a', dus bijvoorbeeld 'kerk is een gebouw'. In alle andere gevallen kun je een klasse niet extenden...
Er zijn uiteraard ook andere alternatieven waarbij je bijvoorbeeld vooraf een instantie van de databaseklasse aanmaakt en die in een Registry bewaart. Maar het komt er altijd op neer dat je een instantie van die klasse gebruikt en nooit op een statische manier functies uit die klasse aanroept. De instantie van jouw database klasse representeert immers de verbinding met jouw database.
Blanche schreef op 16.06.2009 12:46:
Ok, heel erg bedankt ik ga hier even mee verder.Ja. Die database klasse verzorgt de verbinding met jouw database. Als jij in een bepaalde andere klasse een database verbinding nodig hebt, maak je dus een instantie van je database klasse aan waarmee je vervolgens kunt werken.
Er zijn uiteraard ook andere alternatieven waarbij je bijvoorbeeld vooraf een instantie van de databaseklasse aanmaakt en die in een Registry bewaart. Maar het komt er altijd op neer dat je een instantie van die klasse gebruikt en nooit op een statische manier functies uit die klasse aanroept. De instantie van jouw database klasse representeert immers de verbinding met jouw database.
Er zijn uiteraard ook andere alternatieven waarbij je bijvoorbeeld vooraf een instantie van de databaseklasse aanmaakt en die in een Registry bewaart. Maar het komt er altijd op neer dat je een instantie van die klasse gebruikt en nooit op een statische manier functies uit die klasse aanroept. De instantie van jouw database klasse representeert immers de verbinding met jouw database.