Hoe variabele oproepen in OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Ariën  -
Beheerder

- Ariën -

29/11/2010 13:57:15
Quote Anchor link
Hej

Ik ben een beetje aan het spelen met OOP om een eigen MVC-frameworkje te bouwen.

Nu loop ik hierop vast:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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." );
    }

}

?>


En dit allemaal wordt in index.php uitgevoerd met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
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?
 
PHP hulp

PHP hulp

28/04/2024 23:56:01
 
Bas Cost Budde

Bas Cost Budde

29/11/2010 14:11:58
Quote Anchor link
$fc->total_time
 
- Ariën  -
Beheerder

- Ariën -

29/11/2010 14:52:07
Quote Anchor link
Ik ga eens proberen. Maar het leuke is dat $total_time in dispatch() staat, waarom is het dan geen:

$fc->dispatch->total_time?

Toevoeging op 29/11/2010 15:08:54:

En nee, dit werkt niet.
 
Bas Cost Budde

Bas Cost Budde

29/11/2010 15:17:02
Quote Anchor link
dispatch() is een methode van je object. total_time is een property, ook van je object. De notatie met twee pijlen zegt: Geef mij van het fc-object het onderdeel dispatch, en, veronderstellende dat dat ook weer een object is, daarvan het onderdeel total_time.

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...
 
- Ariën  -
Beheerder

- Ariën -

29/11/2010 15:29:47
Quote Anchor link
Ja, gedaan.

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 -
 
Bas Cost Budde

Bas Cost Budde

29/11/2010 15:49:50
Quote Anchor link
Err. :( wat geeft print_r($fc) ? (ipv echo parsetime)
 
- Ariën  -
Beheerder

- Ariën -

29/11/2010 16:11:46
Quote Anchor link
QFrontController Object
(
[total_time] =>
)


Leeg dus... :/
 
Bas Cost Budde

Bas Cost Budde

29/11/2010 16:18:59
Quote Anchor link
wordt dispatch() bereikt en uitgevoerd?
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.)
 
Chris -

Chris -

29/11/2010 16:38:38
Quote Anchor link
Het is maandag...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$total_time = $end_time - $start_time;


Waar zet je hem in z'n public var dan? ;-)
 
Bas Cost Budde

Bas Cost Budde

29/11/2010 16:40:22
Quote Anchor link
ohja. $this->total_time dus.
 
- Ariën  -
Beheerder

- Ariën -

29/11/2010 16:44:52
Quote Anchor link
Bas Cost Budde op 29/11/2010 16:40:22:
ohja. $this->total_time dus.

Hè hè :-P
 
Chris -

Chris -

29/11/2010 16:48:53
Quote Anchor link
Was dat de fout ja? Mag hoor, het is (dra)maandag!
 
TJVB tvb

TJVB tvb

29/11/2010 16:50:17
Quote Anchor link
En het koppelen van functies kan wel.

Je moet dan bij je functies het object teruggeven als resultaat (dus gewoon return $this; )

Je krijgt dan:
echo 'Parsetime: '.$fc->dispatch()->total_time;
 
Bas Cost Budde

Bas Cost Budde

29/11/2010 16:52:20
Quote Anchor link
Dat zijn twee belangrijke wijzigingen: () achter de methodenaam, en de methode zelf aanpassen.

Fluid interface. Programmeert wel lekker.
 
Niels K

Niels K

29/11/2010 16:57:32
Quote Anchor link
Maar goed, waarom maak je geen getter? Vind variabelen uit een klasse aanroepen altijd niet-oop achtig.
 
Pim -

Pim -

29/11/2010 16:58:58
Quote Anchor link
Verder is die die() ook een ramp natuurlijk... (en een leuke woordspeling ;) ) Gebruik exceptions!

Goede MVC tut
Gewijzigd op 29/11/2010 17:06:02 door Pim -
 
- Ariën  -
Beheerder

- Ariën -

29/11/2010 17:17:48
Quote Anchor link
Ja, die heb ik al ingebouwd zojuist.

Die() is nu naar het kerkhof gestuurd ;-)
 
Pim -

Pim -

29/11/2010 18:57:22
Quote Anchor link
Mag ik je vragen hoe je de routing hebt geregeld?
 

29/11/2010 18:59:09
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

29/11/2010 19:08:09
Quote Anchor link
Pim - op 29/11/2010 18:57:22:
Mag ik je vragen hoe je de routing hebt geregeld?

In de constructor :-)
Multiview's :-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.