Class die database objecten bijhoud

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joren Van Hee

Joren Van Hee

08/11/2010 22:58:52
Quote Anchor link
Hej,

Ik werk al een tijdje met mijn eigen framework, die ik later wel eens zal posten, maar nu zoek ik een manier om mijn database connecties te regelen. In mijn framework heb ik config bestanden. En er is bijvoorbeeld ook een config bestand voor de database. Daar kan je verschillende login gegevens ingeven en zeggen welk database type er gebruikt moet worden enz. Nu heb ik geprobeerd een database class te maken waar bij je een database instantie kan oproepen ($database::instance()). Als je geen parameters meegeeft, dan maakt hij gewoon verbinding met de default database en zou hij zo'n database object moeten returnen. Eventueel kan je een parameter meegeven, met de naam van database configuratie, en dan zal hij een ander database object returnen. Zelf moet die classe alle verschillende database objecten bijhouden, en duplicaten vermijden natuurlijk. Hieronder zie je mijn poging.

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
<?php

class Database {

    private static $instances = array();
    
    public static function instance($name = null) {
        if($name === null) {
            self::instance('default');
        }

        else {
            if(array_key_exists($name, self::$instances)) {
                return self::$instances[$name];
            }

            else {
                return self::create($name);
            }
        }
    }

    
    private static function create($name) {
        $config = kolia::config('database.'.$name);
        $type = $config['type'];
        if(!method_exists(get_class(), $type))
            throw new KoliaException(ucfirst($config['type']).' database not supported' ,ucfirst($config['type']).' is currently not supported, you can add this functionallity by editing '.SYSPATH.'classes/database.php.');
        self::$instances[$name] = self::$type($config);
        return self::$instances[$name];
    }

    
    private static function mysqli($config) {
        $config['port'] = $config['port'] == '' ? ini_get("mysqli.default_port") : $config['port'];
        $mysqli_object = new mysqli($config['hostname'], $config['username'], $config['password'], $config['database'], $config['port']);
        if(mysqli_connect_error())
            throw new KoliaException('Connection failed', mysqli_connect_error());
        return $mysqli_object;
    }
    
}


?>


Het probleem met deze classe is, dat het object dat hij returned, niet gebruikt kan worden. Hieronder een voorbeeld.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$db = Database::instance();
$db->query();


Als ik die code uitvoer in mijn controller bijvoorbeeld, dan geeft php een error. Call to a member function query() on a non-object... Nu heb ik eens getest tot waar het object gebruikt kan worden. Tot in de database class, functie instance, kan ik het object gebruiken. Maar als ik het return, en dan wil ik hem gebruiken zoals hier boven, dan werkt het niet meer.

Heeft iemand hier een oplossing voor, of eventueel een andere manier om zo'n database systeem in mijn frameworkje te stoppen.

Ik hoop dat ik het niet te ingewikkeld heb uitgelegd, het is nog al moeilijk om te verwoorden :o

alvast bedankt,
Joren
 
PHP hulp

PHP hulp

28/03/2024 16:10:33
 
Hipska BE

Hipska BE

09/11/2010 00:00:25
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if($name === null) {
            self::instance('default');
        }

en waar return je dan?
 
Joren Van Hee

Joren Van Hee

09/11/2010 00:04:54
Quote Anchor link
Ooh, bedankt!
Het werkt. Met die return ervoor werkt het perfect :).
Bedankt voor je tijd
 
Pim -

Pim -

09/11/2010 09:52:18
Quote Anchor link
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
<?php
    public static function instance($name = null) {
        if($name === null) {
            self::instance('default');
        }

        else {
            if(array_key_exists($name, self::$instances)) {
                return self::$instances[$name];
            }

            else {
                return self::create($name);
            }
        }
    }

// Kan toch gewoon zo
    public static function instance($name = 'default') {
        if(array_key_exists($name, self::$instances)) {
            return self::$instances[$name];
        }

        else {
            return self::create($name);
        }
    }
 



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.