Me classes de database laten gebruiken
Ik heb een hoop classes die allemaal wat regellen. Maar velen hebben een database connectie nodig dus moeten ze gebruik maken van de database class. Maar hoe doe je dit op een goeie manier? Als ik iedereen maar de database class geef dan hangt het teveel aan me database class en kan ik daar dus nooit meer wat aan aanpassen
Als je nog meer singleton instanties hebt kan je ook kijken naar het registry pattern
Ja, registry is in principe een verzameling van meerdere instanties. Erg handig voor klassen die je vaak gebruikt zoals Database, user, smarty noem maar op.
Jurgen Meijer op 07/06/2010 10:32:01:
Ik vindt deze notatie wel interessant.
Waarom niet gewoon DataBase::getInstance();
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
49
50
51
52
53
54
55
56
57
58
59
60
<?php
class Database extends PDO {
private static $_oInstance;
const MYSQL = 'mysql';
const PGSQL = 'pgsql';
private $aAuthData = array();
private $sEngine = 'mysql';
public function __construct($Engine, $aAuthData) {
$pdo = parent::__construct($Engine.':host='.$aAuthData['Host'].';dbname='.$aAuthData['Database'],$aAuthData['Username'],$aAuthData['Password']);
parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}
public static function initialise($sEngine = 'mysql', $aAuth = array() ) {
if(!empty($sEngine)) {
if (is_null(self::$_oInstance)) {
if(is_array($aAuth) && count($aAuth) > 0) {
if(array_key_exists('Host', $aAuth) && array_key_exists('Username', $aAuth) && array_key_exists('Password', $aAuth) && array_key_exists('Database', $aAuth)) {
$c = __CLASS__;
self::$_oInstance = new $c($sEngine, $aAuth);
return self::$_oInstance;
} else {
throw new DatabaseException('Authorisation array is incomplete for "'.__FUNCTION__.'"', DatabaseException::E_USER_ERROR);
}
} else {
throw new DatabaseException('Wrong or no parameter given for "'.__FUNCTION__.'"', DatabaseException::E_USER_ERROR);
}
} else {
return self::$_oInstance;
}
} else {
throw new DatabaseException('Database needs Engine', DatabaseException::E_CORE_WARNING);
}
}
public static function pdo() {
if(!is_null(self::$_oInstance)) {
return self::$_oInstance;
} else {
throw new DatabaseException('PDO needs initialising first', DatabaseException::E_USER_ERROR);
}
}
public function __clone() {
}
public function __destruct() {
}
}
?>
class Database extends PDO {
private static $_oInstance;
const MYSQL = 'mysql';
const PGSQL = 'pgsql';
private $aAuthData = array();
private $sEngine = 'mysql';
public function __construct($Engine, $aAuthData) {
$pdo = parent::__construct($Engine.':host='.$aAuthData['Host'].';dbname='.$aAuthData['Database'],$aAuthData['Username'],$aAuthData['Password']);
parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}
public static function initialise($sEngine = 'mysql', $aAuth = array() ) {
if(!empty($sEngine)) {
if (is_null(self::$_oInstance)) {
if(is_array($aAuth) && count($aAuth) > 0) {
if(array_key_exists('Host', $aAuth) && array_key_exists('Username', $aAuth) && array_key_exists('Password', $aAuth) && array_key_exists('Database', $aAuth)) {
$c = __CLASS__;
self::$_oInstance = new $c($sEngine, $aAuth);
return self::$_oInstance;
} else {
throw new DatabaseException('Authorisation array is incomplete for "'.__FUNCTION__.'"', DatabaseException::E_USER_ERROR);
}
} else {
throw new DatabaseException('Wrong or no parameter given for "'.__FUNCTION__.'"', DatabaseException::E_USER_ERROR);
}
} else {
return self::$_oInstance;
}
} else {
throw new DatabaseException('Database needs Engine', DatabaseException::E_CORE_WARNING);
}
}
public static function pdo() {
if(!is_null(self::$_oInstance)) {
return self::$_oInstance;
} else {
throw new DatabaseException('PDO needs initialising first', DatabaseException::E_USER_ERROR);
}
}
public function __clone() {
}
public function __destruct() {
}
}
?>
Zoiets dan?
Heb je Objecten die vanalles zelf regelen?
Of maak je gebruik van DAO's?
Maak je gebruik van Controllers?
Een singleton is een mogelijke oplossing. Houd er dan wel rekening mee dat als je op een gegeven moment veel bezoekers op je pagina krijgt dat je wellicht niet alle requests over die ene verbinding kunt krijgen...
Andreas Warnaar op 07/06/2010 14:21:59:
Ik vindt deze notatie wel interessant.
Waarom niet gewoon DataBase::getInstance();
Jurgen Meijer op 07/06/2010 10:32:01:
Ik vindt deze notatie wel interessant.
Waarom niet gewoon DataBase::getInstance();