Hoe variabele oproepen in OOP
Ik ben een beetje aan het spelen met OOP om een eigen MVC-frameworkje te bouwen.
Nu loop ik hierop vast:
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
31
32
33
34
35
36
37
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
32
33
34
35
36
37
<?php
class QFrontController
{
public $total_time;
public function __construct () {
// **snip**
$this->dispatch ( $controller, $action );
}
public function dispatch ( $controller, $action ) {
if ( file_exists ( $controller . 'controller.php' ) ) {
/** Het verwachtte bestand bestaat (guestbookcontroller.php). */
$start_time = microtime(true);
require_once ( $controller . 'controller.php' );
$end_time = microtime(true);
$total_time = $end_time - $start_time;
$controllername = ucfirst ( $controller ) . 'Controller';
if ( class_exists ( $controllername ) ) { // bestaat GuestbookController?
if ( in_array ( $action, get_class_methods ( $controllername ) ) ) {
/** Actie bestaat ook, dus uitvoeren. */
$controllerobject = new $controllername ();
$controllerobject -> $action ();
/** Actie uitgevoerd. Afsluiten! */
return;
}
}
}
die ( "Deze pagina bestaat niet." );
}
}
?>
class QFrontController
{
public $total_time;
public function __construct () {
// **snip**
$this->dispatch ( $controller, $action );
}
public function dispatch ( $controller, $action ) {
if ( file_exists ( $controller . 'controller.php' ) ) {
/** Het verwachtte bestand bestaat (guestbookcontroller.php). */
$start_time = microtime(true);
require_once ( $controller . 'controller.php' );
$end_time = microtime(true);
$total_time = $end_time - $start_time;
$controllername = ucfirst ( $controller ) . 'Controller';
if ( class_exists ( $controllername ) ) { // bestaat GuestbookController?
if ( in_array ( $action, get_class_methods ( $controllername ) ) ) {
/** Actie bestaat ook, dus uitvoeren. */
$controllerobject = new $controllername ();
$controllerobject -> $action ();
/** Actie uitgevoerd. Afsluiten! */
return;
}
}
}
die ( "Deze pagina bestaat niet." );
}
}
?>
En dit allemaal wordt in index.php uitgevoerd met:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
require_once ( 'frontcontroller.php' );
$fc = new QFrontController ();
echo "Parsetime: ".$fc->dispatch->total_time;
?>
require_once ( 'frontcontroller.php' );
$fc = new QFrontController ();
echo "Parsetime: ".$fc->dispatch->total_time;
?>
Hoe kan ik nou die $total_time nou oproepen?
$fc->dispatch->total_time geeft niks terug, en $total_time is toch echt public?
How come?
$fc->total_time
$fc->dispatch->total_time?
Toevoeging op 29/11/2010 15:08:54:
En nee, dit werkt niet.
Dat klopt dus niet.
Betekent 'werkt niet' dat je geen waarde terugkrijgt? total_time is pas gezet nadat dispatch() is uitgevoerd he. Hm, maar dat doe je in de constructor van de frontcontroller al.
Zet de foutweergave eens aan...
Niks, nada nothing. Geen enkele notice....
Waarde blijft leeg.
Hoe moet het dan wel?
Gewijzigd op 29/11/2010 15:47:40 door - Ariën -
Err. :( wat geeft print_r($fc) ? (ipv echo parsetime)
(
[total_time] =>
)
Leeg dus... :/
is aan de if()-conditie waarbinnen total_time wordt gezet, voldaan?
(testen met echo "aar" op strategische plekken. "aar"? dat grept makkelijk, als je debug-statements in je code had achtergelaten. Of kies een herkenbare tekenreeks.)
ohja. $this->total_time dus.
Bas Cost Budde op 29/11/2010 16:40:22:
ohja. $this->total_time dus.
Hè hè :-P
Was dat de fout ja? Mag hoor, het is (dra)maandag!
Je moet dan bij je functies het object teruggeven als resultaat (dus gewoon return $this; )
Je krijgt dan:
echo 'Parsetime: '.$fc->dispatch()->total_time;
Fluid interface. Programmeert wel lekker.
Maar goed, waarom maak je geen getter? Vind variabelen uit een klasse aanroepen altijd niet-oop achtig.
Die() is nu naar het kerkhof gestuurd ;-)
Mag ik je vragen hoe je de routing hebt geregeld?
Niels Kieviet op 29/11/2010 16:57:32:
Maar goed, waarom maak je geen getter? Vind variabelen uit een klasse aanroepen altijd niet-oop achtig.
Inderdaad, dit is het perfecte voorbeeld voor een getter.
Pim - op 29/11/2010 18:57:22:
Mag ik je vragen hoe je de routing hebt geregeld?
In de constructor :-)
Multiview's :-)