OOP syntaxen en werkingen
Pagina: « vorige 1 2 3 4 volgende »
Het idee van overerving is dat je bepaalde functionaliteit al inbouwt in de basis class (bij jou dbConnect) zodat die in alle afgeleide classes automatisch beschikbaar komt. Je overschrijft nu echter alles weer in dbConnectMySQL waardoor je hele basis class niets meer toevoegt. Nog los van het feit dat je niet bestaande properties niet kunt returnen (wat je nu doet in dbConnect).
Een ander punt is dat je de dbConfig helemaal niet gebruikt. Het idee is dat je die meegeeft aan een connectie class en dat de connectie class de gegevens eruit haalt wanneer het nodig is. Je constructor van dbConnectMySQL neemt nu echter all gegevens als parameters op en slaat het dan weer op in private properties. Zo gebruik je die hele dbConfig dus niet.
dus zou die er niet eerder uitgeknikkert moeten worden? of wat hoort daar voor functie er in
ik heb nu
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
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
<?php
class dbConfig
{
protected $host = false;
protected $name = false;
protected $pass = false;
protected $database = false;
function __construct($hostname, $username, $pass)
{
$this->host = $host;
$this->name = $name;
$this->pass = $pass;
$this->database = $database;
}
public function getHost()
{
return $this->host;
}
public function getName()
{
return $this->name;
}
public function getPass()
{
return $this->pass;
}
public function getDatabase()
{
return $this->database;
}
function __destruct()
{
#destruction!
}
}
?>
class dbConfig
{
protected $host = false;
protected $name = false;
protected $pass = false;
protected $database = false;
function __construct($hostname, $username, $pass)
{
$this->host = $host;
$this->name = $name;
$this->pass = $pass;
$this->database = $database;
}
public function getHost()
{
return $this->host;
}
public function getName()
{
return $this->name;
}
public function getPass()
{
return $this->pass;
}
public function getDatabase()
{
return $this->database;
}
function __destruct()
{
#destruction!
}
}
?>
en dan dbConnect extends.. dbConfig..
dbConnectMySQL extends dbConnect
kan dit?
Nee, dbConnect moet niet dbConfig extenden. Dat zijn twee verschillende entiteiten. Een dbConnect heeft een dbConfig nodig, maar het is er niet een.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
abstract class dbConfig
{
protected $type = false;
public function __construct($dbType)
{
$this->type = $dbType;
}
public abstract function getHost();
public abstract function getName();
public abstract function getPass();
public abstract function getDatabase();
function __destruct()
{
#destruction!
}
}
?>
abstract class dbConfig
{
protected $type = false;
public function __construct($dbType)
{
$this->type = $dbType;
}
public abstract function getHost();
public abstract function getName();
public abstract function getPass();
public abstract function getDatabase();
function __destruct()
{
#destruction!
}
}
?>
dan kan ik toch dbConnect weglaten en in elke child die dingen aanroepen toch? want meerdere childs kunnen dan die dbConfig aanroepen om connectie te maken.
bij
Code (php)
of.. moet ik dbConnect erin laten hier de connectie verwerken en deze dan laten extenden.. maar hoe zou dbConnect eruit moeten zien dan?
Gewijzigd op 12/06/2012 15:12:17 door Reshad F
Of je dbConnect weg kan laten is onafhankelijk van wat je met dbConfig doet.
Op de vraag of dat kan (dbConnect weglaten), op zich wel. Wat je altijd moet afvragen bij het maken (of niet) van een superclass is of je enige functionaliteit hebt dat gedeeld zal worden door alle afgeleide classes. Qua hoe elke afgeleide class de connectie maakt met de database heb je mogelijk gelijk dat dat niet altijd hetzelfde is. Wat je echter in elk geval deelt, is het inladen van de configuratie. Zelfs als dbConnect alleen de toegang tot het dbConfig object regelt, dan heb je al een functionaliteit die alle afgeleide classes zullen delen en dus heeft dbConnect recht van bestaan.
Aangezien dbConnect geen afgeleide class is van dbConfig, kan dbConnect geen abstracte methodes uit dbConfig aanroepen.....
dbConfig moet een normale class zijn (dus NIET abstract) en mag GEEN abstracte methodes hebben. Heeft dbConfig dat wel dan is de class niet bruikbaar voor dbConnect.
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
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
<?php
class dbConfig
{
protected $type = false;
public function __construct($dbType)
{
$this->type = $dbType;
}
public function getHost()
{
return $this->host;
}
public function getUsername()
{
return $this->username;
}
public function getPassword()
{
return $this->password;
}
function __destruct()
{
#destruction!
}
}
?>
class dbConfig
{
protected $type = false;
public function __construct($dbType)
{
$this->type = $dbType;
}
public function getHost()
{
return $this->host;
}
public function getUsername()
{
return $this->username;
}
public function getPassword()
{
return $this->password;
}
function __destruct()
{
#destruction!
}
}
?>
maar hoe komt dbConnect eruit tezien dan zoiets?
De class dbConnect zou ik dan wel abstract maken, want die wil je nooit als zodanig gebruiken, maar altijd een van de afgeleide classes ervan. Verder is dit een begin inderdaad. Dit kan je dus bijna in beton gieten :-)
nu hetgeen waar ik dus niet uitkomt dit stukjee
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
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
<?php
class dbConnectMySQL extends dbConnect
{
private $database;
public $startQuery;
public $getResults;
public function __construct($database, $dbConnect)
{
$this->dbConnect = $dbConnect;
}
public function openConnection()
{
try
{
$this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
$this->dbConnect = mysql_select_db($this->database);
}
catch (Exception $e)
{
return $e;
}
}
}
?>
class dbConnectMySQL extends dbConnect
{
private $database;
public $startQuery;
public $getResults;
public function __construct($database, $dbConnect)
{
$this->dbConnect = $dbConnect;
}
public function openConnection()
{
try
{
$this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
$this->dbConnect = mysql_select_db($this->database);
}
catch (Exception $e)
{
return $e;
}
}
}
?>
en dan vooral: $this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
is dit goed zo of moet het $this->dbConnect->host, etcc
en dien ik hier ook weer dingen te defineren die ge-extend worden? nee toch want de properties neemt ie mee. maar als foutmelding krijg ik nu met dit: $this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
undefined property, maar wanneer ik er dbConnect in gebruik krijg ik Trying to get property of non-object wat dus wijst op een query die niet goed is volgens mij.. kan je hier wat meer uitleg over geven a.u.b? :)
Je maakt een instance van dbConfig aan. Hierin sla je de settings op:
Hoe roep je nu bijv. de user op? Dat doe je toch met:
Nu laad je de klasse dbConfig in als een variabele in een dbConnect klasse:
In de constructor van DbConnect plaats je dan deze config in de property $this->config.
Vervolgens heb je in een method DbConnectMySQL::openConnection() de waarde van die DbConfig nodig. Hou pak je ze dan? Nou gewoon op dezelfde manier hoe je dat in het echt doet:
Code (php)
Of als je dat makkelijker te begrijpen vind:
Code (php)
Gewijzigd op 12/06/2012 19:31:15 door Wouter J
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
public function __construct($database, $dbConnect)
{
$this->dbConnect = $dbConnect;
}
?>
public function __construct($database, $dbConnect)
{
$this->dbConnect = $dbConnect;
}
?>
dbConnectMySQL extend dbConnect, dus je moet geen dbConnect meer meegeven. Alle functionaliteit is beschikbaar door het extenden (alleen private properties en methodes kan je niet aanroepen).
Verder moet je nog wel de __construct van de parent aanroepen als je die in dbConnectMySQL overschrijft, anders wordt die functie niet uitgevoerd:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
public function __construct( $dbConfig )
{
parent::__construct( $dbConfig );
}
?>
public function __construct( $dbConfig )
{
parent::__construct( $dbConfig );
}
?>
Heb je overigens niets nieuws in de __construct dan kan je die weglaten, dan wordt automatisch de __construct van de parent aangeroepen.
Als je de gegevens van de dbConfig wilt aanroepen dan kan dat via
dbConfig is namelijk in dbConnect als protected opgegeven, dus daar kan je bij.
Gewijzigd op 12/06/2012 17:28:07 door Erwin H
bij extenden van dbConfig krijg ik geen foutmeldingen maar ook geen rijen terug
en bij dbConnect ook geen rijen maar ook dit erbij:
Notice: Undefined property: dbConnectMySQL::$host in /Applications/MAMP/htdocs/library/db.class.php on line 63
Notice: Undefined property: dbConnectMySQL::$username in /Applications/MAMP/htdocs/library/db.class.php on line 63
Notice: Undefined property: dbConnectMySQL::$password in /Applications/MAMP/htdocs/library/db.class.php on line 63
zijn
Maar aan Wouter voor het antwoord :-)
Gewijzigd op 12/06/2012 19:31:44 door Wouter J
mijn code om alles aan te roepen en weergeven heb ik even zo..
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$config = new dbConfig($adres, $gebruikersnaam, $wachtwoord, $databasenaam);
$connectie = new dbConnectieMySQL($config);
echo '<pre>';
var_dump($connectie);
$test = $config->startQuery("SELECT id, name, password FROM members");
if($test === false)
{
echo 'kon niet benaderd worden';
}
else
{
while($row = mysql_fetch_assoc($test))
{
echo 'id: ' . $row['id'] . '<br>';
echo 'name: ' . $row['name'] . '<br>';
echo 'password: ' . $row['password'] . '<br><br>';
}
}
?>
$config = new dbConfig($adres, $gebruikersnaam, $wachtwoord, $databasenaam);
$connectie = new dbConnectieMySQL($config);
echo '<pre>';
var_dump($connectie);
$test = $config->startQuery("SELECT id, name, password FROM members");
if($test === false)
{
echo 'kon niet benaderd worden';
}
else
{
while($row = mysql_fetch_assoc($test))
{
echo 'id: ' . $row['id'] . '<br>';
echo 'name: ' . $row['name'] . '<br>';
echo 'password: ' . $row['password'] . '<br><br>';
}
}
?>
en dit is de class http://pastebin.com/jjpd2hw1
ik heb config even gedumped zoals je ziet. maar ik krijg geen resultt en die undefined property voor deze regels in dbConnectMySQL
$this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
$this->dbConnect = mysql_select_db($this->database);
Waar worden de $this->host en $this->username properties dan geset? Nergens toch? Lees eens Erwin's en mijn reactie, want daar heb je nog niet heel veel van opgestoken...
dat wordt toch in dbConfig gedaan?
Als je dus in Klasse A een property set kun je die in Klasse B niet gebruiken. Daarvoor moet je die in Klasse B eerst opslaan.
Nu sla je Klasse A op in een property van Klasse B. Het enige wat je dus moet doen is naar de property gaan waarin Klasse A zit en dan met methods van Klasse A de waardes verkrijgen.
DbConfig en DbConnect zijn 2 totaal verschillende klassen en 2 totaal verschillende scopes. Het enige wat je doet is dat je een instance van Dbconfig inlaad in een property van DbConnect.
object(dbConnectMySQL)#2 (7) {
["database":"dbConnectMySQL":private]=>
NULL
["startQuery"]=>
NULL
["getResults"]=>
NULL
["dbConfig":protected]=>
object(dbConfig)#1 (4) {
["type":protected]=>
string(9) "127.0.0.1"
["host":protected]=>
string(4) "root"
["username":protected]=>
string(4) "root"
["password":protected]=>
string(9) "portfolio"
}
["host":protected]=>
NULL
["username":protected]=>
NULL
["password":protected]=>
NULL
}
de waardes ervan zijn dus leegg
maar hoe set je die waardes dan in dbConnect?