pdo singleton
ik ben bezig om een singleton op te zetten nu wil de mijne alleen niet werken
de code zal ik hier onder plaatsen.
als er iemand zo vriendelijk wil zijn om er naar te kijken en als hij/zij wqat ziet mij op fouten te wijzen is het heel erg welkom
de error die ik op het moment krijg is devolgende:
Fatal error: Access to undeclared static property: test::$db in /home/wpviewer/domains/webpageviewer.com/public_html/ralph/test/classes/test.class.php on line 32
Mvg ralph
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
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
<?
class test{
public $db, $table, $fields, $query;
private $server, $database, $username, $password;
protected static $instance ;
private function __construct() {
$this->server = 'localhost';
$this->database = '*************';
$this->username = '*************';
$this->password = '*************';
$this->debug = true;
try {
echo "er wordt verbinding gemaakt<br />";
self::$db = new PDO("mysql:host=".$this->server."; dbname=".$this->database, $this->username, $this->password);
}
catch (PDOException $e) {
die('Error: Database connection failed');
}
$this->fields = array();
$this->conditions = array();
}
//conectie
public static function getInstance() {
if(!self::$db) {
self::$db = new test();
}
return self::$db;
}
}
?>
class test{
public $db, $table, $fields, $query;
private $server, $database, $username, $password;
protected static $instance ;
private function __construct() {
$this->server = 'localhost';
$this->database = '*************';
$this->username = '*************';
$this->password = '*************';
$this->debug = true;
try {
echo "er wordt verbinding gemaakt<br />";
self::$db = new PDO("mysql:host=".$this->server."; dbname=".$this->database, $this->username, $this->password);
}
catch (PDOException $e) {
die('Error: Database connection failed');
}
$this->fields = array();
$this->conditions = array();
}
//conectie
public static function getInstance() {
if(!self::$db) {
self::$db = new test();
}
return self::$db;
}
}
?>
Maar goed, het probleem zit natuurlijk in het feit dat je een property probeert aan te spreken in een static method. Dat kan helemaal niet als je die methode ook echt als een static methode aanroept. in dat geval bestaat er namelijk geen instantie van de class en dus ook geen properties.
en hoe zou het dan moeten ?
Geen singleton, geen static methods en geen publieke properties.
dit is mijn eerste keer oop dus dit zegt mij nog vrij weinig
Singleton:
- Geeft problemen met unit tests
- Is niet in overeenstemming met het '1 class, 1 functie' principe
Publieke properties:
- Zorgt ervoor dat je class niet meer de controle heeft over zijn properties en dus dat je class niet meer kan garanderen dat waardes in overeenstemming met elkaar zijn
Static methodes:
- Is in feite gewoon geen OOP, het is het inbrengen van functionele code in een class
- Geeft problemen met unit tests
Gewijzigd op 20/08/2013 11:15:47 door Erwin H
hier kan ik wat mee want nu weet ik wat ik kan veranderen
Dat een singleton/static methods problemen geeft met unit tests, waarom is dat zo'n groot nadeel? Ik gebruik _never_ unit tests, gaat mij om stabiliteit en snelheid?
Code (php)
1
2
3
4
2
3
4
<?php
$test = new Unit(); // Kijken of de klasse Unit het doet.
$test->bar(); // Kijken of de unit zijn bardienst doet.
?>
$test = new Unit(); // Kijken of de klasse Unit het doet.
$test->bar(); // Kijken of de unit zijn bardienst doet.
?>
Dat je dit op grote schaal kunt doen met speciale klassen voor unittesting, is een ander verhaal.
Statische methoden hebben, vind ik, wél beperkt bestaansrecht.
Aah, op die manier.. Maar als je weet welke functies je in een class stop, heb je dat toch helemaal niet nodig :/
Chris - op 20/08/2013 13:58:31:
Aah, op die manier.. Maar als je weet welke functies je in een class stop, heb je dat toch helemaal niet nodig :/
En wat nou als je zo'n epic God object maakt dat je niet eens meer weet op welke plekken hij gebruikt wordt. Dan pas je iets aan, en kun je niet alle scenario's afgaan om te kijken of alles nog steeds werkt => unit tests die elk mogelijke scenario testen. Zo kun je 99% zeker zijn dat je wijziging niks sloopt
Chris - op 20/08/2013 13:58:31:
Aah, op die manier.. Maar als je weet welke functies je in een class stop, heb je dat toch helemaal niet nodig :/
Soms wel. Bij een groter webproject heb je vaak tientallen klassen met honderden methoden en duizenden use cases (bijvoorbeeld allerlei grenswaarden en zeldzame uitzonderingen). Dan is het wel handig als je met één druk op de knop kunt testen of ze allemaal nog werken zoals ze horen te werken.
Ward van der Put op 20/08/2013 13:28:32:
Statische methoden hebben, vind ik, wél beperkt bestaansrecht.
Het voorbeeld hier lijkt me een slecht voorbeeld.
Als je een property "gebruikt"/"nodig hebt"/"terug geeft" ben je niet statisch bezig.
De meeste andere talen (dan php) zouden die methode niet statisch noemen.
Als je echter een methode hebt waar geen enkele property wordt aangeraakt, heb je er alle belang bij om die methode als statisch te zetten.
Andere talen maken inderdaad een onderscheid tussen functies en procedures, maar dat sluit niet altijd aan bij een PHP-workflow. Ik gebruik statische methoden zelf eigenlijk vooral voor zaken waarin in PHP een functie ontbreekt. In dat opzicht begrijp ik ook waarom Erwin dit een te functioneel gebruik van PHP vindt, maar voor bijvoorbeeld een validatie kun je een heel uitgebreide klasse vol (interne) methoden hebben die je toch met slechts één statische methode inzet.
nu heb ik een ander probleem mijn set functies blijven de oude waardes bezitten wat kan hiervoor een oplossing zijn
En toon eens hoe je ze gebruikt buiten de class
bv.
$mijn_object->setName('John')
Gewijzigd op 20/08/2013 15:35:44 door Kris Peeters
en in index.php
hier een insert
Code (php)
Toevoeging op 20/08/2013 16:00:31:
nu zal ik dus eerst de variabelen leeg moeten maken