Class die database objecten bijhoud
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)
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
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;
}
}
?>
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.
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
Het werkt. Met die return ervoor werkt het perfect :).
Bedankt voor je tijd
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
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);
}
}
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);
}
}