Class in een class

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Erwin H

Erwin H

25/12/2012 09:38:51
Quote Anchor link
Ruben Portier op 24/12/2012 13:51:50:
Ik heb dus een database class aangemaakt. Dan maak ik bovenaan in mijn index file het database-object aan door volgende code uit te voeren:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$db = new mysql($host, $user, $pass, $database);

Hier begin je dus al verkeerd. In een echte OOP omgeving is er maar 1 object dat je in de global space (je index file) aanmaakt en dat is de controller of het application object (afhankelijk van welk pattern je gebruikt). De hele afhandeling van het request wordt vervolgens in dat object afgewerkt. Alle andere objecten die worden aangemaakt worden danook vanuit dat ene object geinitieerd.
 
PHP hulp

PHP hulp

22/12/2024 09:02:18
 
Ruben Portier

Ruben Portier

25/12/2012 22:54:24
Quote Anchor link
Ja, zo heb ik het toch ook. Of begrijp ik je hier verkeert? Dit hele topic gaat er net over dat ik maar één object wil aanmaken voor bijvoorbeeld de database. Daarom stuur ik het $db object door naar bijvoorbeeld de user class zodat ik die kan hergebruiken i.p.v. een nieuwe aan te maken.
 
Erwin H

Erwin H

26/12/2012 01:00:19
Quote Anchor link
Ik denk dat je mijn opmerking niet begrijpt. He gaat er niet om hoeveel database objecten je aanmaakt, maar om waar je die aanmaakt. Zoals gezegd, in een echte OOP omgeving zal je dat niet in je index file doen. Daar maak je namelijk alleen het applicatie object aan, verder niets. Een db object maak je normaal gesproken binnen een factory of een service container aan.
 
Ruben Portier

Ruben Portier

26/12/2012 12:05:47
Quote Anchor link
Oke, bedankt! Ik begrijp het nu. Dus ik mag eigenlijk geen database object aanmaken zolang ik deze niet nodig heb. Dus dan moet ik telkens als ik de database nodig heb het volgende doen: $db = new mysql($host,$password..); Als ik dan klaar ben doe ik $db->closeConnection of zoiets? Bedankt alvast!
 
Wouter J

Wouter J

26/12/2012 12:14:38
Quote Anchor link
Ruben, nee dat zegt hij niet. Wat je nu hebt is ongetwijfeld iets als dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
// index.php

$db = new Database(...);

// ... een hele boel lappen code
?>


Wat de juiste OO methode is:"
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
38
39
40
41
42
43
44
45
46
47
48
<?php
// kernel.php

/**
 * De kern van je applicatie
 */

class Kernel
{
    private $database;

    /**
     * Deze functie wordt aangeroepen en handelt een pagina request af.
     */

    public function handle(...)
    {

        $db = $this->getDatabase();

        // ... andere code die alles gaat afhandelen
    }

    protected function getDatabase()
    {

        if (null === $this->database) {
            $this->setDatabase();
        }


        return $this->database;
    }


    protected function setDatabase()
    {

        $this->database = new Database(...);
    }
}

?>

<?php
// bootstrap.php
require_once 'kernel.php';
?>

<?php
// index.php
require_once 'bootstrap.php';

$kernel = new Kernel();

$kernel->handle();
//! niet meer
?>
 
Ruben Portier

Ruben Portier

26/12/2012 13:52:57
Quote Anchor link
Ik denk dat ik het nu helemaal begrijp! Dus ik moet per class een nieuwe database connectie aanmaken? En hoort deze code niet omgedraaid: "$db = $this->getDatabase(); --> $this->getDatabase() = $db;"?

Ik snap het nog niet helemaal. Dus ik mag geen global $db aanmaken? Dus ik moet pas een object aanmaken in de classes zelf? Maar dan zit ik met het probleem dat ik na een tijdje meer dan 10 verschillende database objecten (database connecties) heb en dat bevorderd de performance van de website zeker niet.
 
Erwin H

Erwin H

26/12/2012 13:59:28
Quote Anchor link
Nee, nergens staat dat je elke keer een nieuw database object moet aanmaken. Waar het om gaat is dat je (1) niet buiten je classes om al objecten aanmaakt in je index file en (2) dat je het aanmaken van objecten gestructureerd doet. Als je bijvoorbeeld via een factory of service container werkt, kan je bij elke nieuwe aanvraag voor een database object een referentie geven naar een eerder aangemaakt object. De service container bijvoorbeeld houdt bij welke objecten hij heeft aangemaakt en als er een vraag komt naar een al aangemaakt object, dan maakt hij niet een nieuwe aan, maar geeft de eerder aangemaakte terug.
Dat is wat Wouter hier doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
    protected function getDatabase()
    {

        if (null === $this->database) {
            $this->setDatabase();
        }


        return $this->database;
    }

?>

Als $this->database null is (ergo, er bestaat nog geen database object) dan maakt hij er 1 aan en geeft die terug. Bestaat er wel al 1 dan geeft hij die direct terug.
Wat je nu in de rest van je classes moet doen, is altijd deze functie aanroepen in dit object en dus niet elke class zijn eigen database object laten aanmaken.
 
Ruben Portier

Ruben Portier

26/12/2012 14:06:05
Quote Anchor link
Heel erg bedankt iedereen! Ik moet dus een soort van configuration-class aanmaken waarmee ik andere classes aanmaak, heb ik het goed? Dus dan doe ik bijvoorbeeld:

Dit komt bovenin de index file:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$classes
= new classes();
?>


Dit komt dan in een class:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
class user() {
  private $db;

  function
__contructor() {
    $this->db = $classes->database($host, $user, $pass, $connection);
  }

?>


Maar dan zit ik weer met de vraag, hoe kom ik in die user class aan de $classes class?

EDIT: Na het even beter bekeken te hebben is bovenstaande niet echt een antwoord op mijn vraag. Volgens mij moet ik dus gewoon alle regels waar ik een nieuw object aanmaak uit mijn index halen en dat in een class regelen. Dat is inderdaad iets waarvoor OO bekend staat. Maar dat is niet echt een antwoord op mijn vraag. Want dan moet de kernel class alsnog de $this->database meegeven aan de user class. Dus dat was niet echt mijn vraag

Ik wil weten of het mogelijk is om de user class aan de database class te laten komen zonder dat ik deze hoef mee te sturen en zonder een nieuw object hiervoor aan te maken indien deze al bestaat (buiten de user class aangemaakt).
Gewijzigd op 26/12/2012 14:33:18 door Ruben Portier
 
Erwin H

Erwin H

26/12/2012 15:34:35
Quote Anchor link
Ruben Portier op 26/12/2012 14:06:05:
Ik wil weten of het mogelijk is om de user class aan de database class te laten komen zonder dat ik deze hoef mee te sturen en zonder een nieuw object hiervoor aan te maken indien deze al bestaat (buiten de user class aangemaakt).

Nee, ze komen niet uit de lucht vallen. Je zal altijd op de een of andere manier een object (referentie) moeten doorgeven van het ene object naar het andere.

Wat mij betreft zijn er drie mogelijkheden:
- meegeven in de constructor als het een absolute noodzakelijkheid is (denk aan een database configuratie in een database object)
- meegeven via een setter
- opvragen via een getter

De enige ander manier is dat je met globals gaat werken, maar dat is natuurlijk vloeken in de kerk als je in een OOP omgeving bezig bent.
 
Ruben Portier

Ruben Portier

26/12/2012 18:45:12
Quote Anchor link
Erwin H op 26/12/2012 15:34:35:
Ruben Portier op 26/12/2012 14:06:05:
Ik wil weten of het mogelijk is om de user class aan de database class te laten komen zonder dat ik deze hoef mee te sturen en zonder een nieuw object hiervoor aan te maken indien deze al bestaat (buiten de user class aangemaakt).

Nee, ze komen niet uit de lucht vallen. Je zal altijd op de een of andere manier een object (referentie) moeten doorgeven van het ene object naar het andere.

Wat mij betreft zijn er drie mogelijkheden:
- meegeven in de constructor als het een absolute noodzakelijkheid is (denk aan een database configuratie in een database object)
- meegeven via een setter
- opvragen via een getter

De enige ander manier is dat je met globals gaat werken, maar dat is natuurlijk vloeken in de kerk als je in een OOP omgeving bezig bent.


Bedankt, maar zoals ik het hier nu ook even lees is het niet verstandig om via de contructor van een class alles in te stellen? Dus mijn databaseconfiguratie mag ik ook niet doorsturen aan de new mysql class? Dus ik moet eerst doen $db = new mysql(); en dan $db->set($host, $user...)?

Bedankt alvast!
 
Erwin H

Erwin H

26/12/2012 18:53:20
Quote Anchor link
Vuistregel (die ik aanhoud): als een class geen enkele functionaliteit kan bieden als een ander object niet beschikbaar is, dan geef ik die daar waar mogelijk mee in de constructor. Bij een database class dus, als je geen configuratie hebt, kan je geen connectie maken en geen query uitvoeren. In dat geval is het dus zinvol om het configuratie object mee te geven in de constructor.
Voor je user class, die user class kan vast ook nog wel dingen zonder dat er een database connectie is. Het meegeven van het database object in de constructor is dan dus geen noodzaak en dus geen goed idee.

Bedenk dat als je een object mee moet geven in de constructor, je die class niet meer kunt aanmaken als dat mee te geven object niet beschikbaar is. Als je dus iets kan zonder dat object, is het verstandig die afhankelijkheid niet te sterk te maken.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/12/2012 19:22:56
Quote Anchor link
Je kan natuurlijk ook een default NULL of false aan het constructor meegeven, dan kan in je het object altijd nog de db class initiëren mocht je hem nodig hebben
Gewijzigd op 26/12/2012 19:23:30 door Ger van Steenderen
 
Ruben Portier

Ruben Portier

27/12/2012 13:30:09
Quote Anchor link
Ik denk dat ik het dus maar houdt bij het doorsturen van de database class naar de user class enz.

Voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$db
= new mysql($host, $user, $pass, $database);
$user = new user($db);
?>


Ik denk dat dit gewoon de meest simpele en veilige manier is. Je geeft alleen het object mee als je dat wil.

Nogmaals heel erg bedankt aan iedereen die me geholpen heeft!
 

Pagina: « vorige 1 2



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.