mcdronkz stort zich op OOP
Nou, ik heb me volledig gestort op het leren van OOP. Na in een boek kennis gemaakt te hebben met de basics wil ik nu zelf aan de slag. Voor een simpel eerste script heb ik besloten een simpel gastenboek te schrijven.
Eerst ben ik begonnen een database class te schrijven, waarin ik ongetwijfeld dingen doe die lelijk en vies zijn:
Vraag me niet precies waarom ik bovenaan wat protected variabelen maak, vertel me liever of dat correct is of niet ;-).
Verbinding maken met een database is geen probleem, maar dan probeer ik dus een gastenboek class te schrijven waarin ik berichten ophaal uit de database:
Nu krijg ik sowieso de volgende foutmelding:
Ik wil dus vanuit de ene class een method in de andere class aanroepen, maar dit lukt dus niet. Kan iemand me uitleggen wat ik wél moet doen ?
Is mijn opbouw enigzins verantwoord, of programmeer ik nu alsof ik een gigantisch bord voor m'n kop heb ? Let wel, ik kan redelijk procudereel scripten, maar van OOP heb ik absoluut geen kaas gegeten. Ik ben nu nog jong en fris genoeg om het te leren, en m'n PHP skills mogen wel een nieuwe impuls krijgen. Maar hou het aub begrijpelijk zonder met lastige termen te gaan gooien.
Eerst ben ik begonnen een database class te schrijven, waarin ik ongetwijfeld dingen doe die lelijk en vies zijn:
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
class MySQL {
protected $location;
protected $username;
protected $password;
protected $dbName;
function ___construct($dbName) {
$this->connectToDB();
$this->selectDB($dbName);
}
function connectToDB ($location = "localhost", $username = "root", $password = "blaat") {
mysql_connect($location, $username, $password) or die(mysql_error());
}
function selectDB ($dbName) {
mysql_select_db($dbName) or die(mysql_error());
}
function doQuery ($query) {
return mysql_query($query);
}
}
?>
class MySQL {
protected $location;
protected $username;
protected $password;
protected $dbName;
function ___construct($dbName) {
$this->connectToDB();
$this->selectDB($dbName);
}
function connectToDB ($location = "localhost", $username = "root", $password = "blaat") {
mysql_connect($location, $username, $password) or die(mysql_error());
}
function selectDB ($dbName) {
mysql_select_db($dbName) or die(mysql_error());
}
function doQuery ($query) {
return mysql_query($query);
}
}
?>
Vraag me niet precies waarom ik bovenaan wat protected variabelen maak, vertel me liever of dat correct is of niet ;-).
Verbinding maken met een database is geen probleem, maar dan probeer ik dus een gastenboek class te schrijven waarin ik berichten ophaal uit de database:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class gastenboek {
function leesBerichtenUitDB () {
$sql = $db->query("SELECT * FROM gastenboek");
$berichten = array();
while($result = mysql_fetch_assoc($sql) {
$berichten[] = $result;
}
return $berichten;
}
}
?>
class gastenboek {
function leesBerichtenUitDB () {
$sql = $db->query("SELECT * FROM gastenboek");
$berichten = array();
while($result = mysql_fetch_assoc($sql) {
$berichten[] = $result;
}
return $berichten;
}
}
?>
Nu krijg ik sowieso de volgende foutmelding:
Code (php)
1
2
3
2
3
Notice: Undefined variable: db in C:\Program Files\Apache Group\Apache2\htdocs\gastenboekOO\gbClass.php on line 4
Fatal error: Call to a member function query() on a non-object in C:\Program Files\Apache Group\Apache2\htdocs\gastenboekOO\gbClass.php on line 4
Fatal error: Call to a member function query() on a non-object in C:\Program Files\Apache Group\Apache2\htdocs\gastenboekOO\gbClass.php on line 4
Ik wil dus vanuit de ene class een method in de andere class aanroepen, maar dit lukt dus niet. Kan iemand me uitleggen wat ik wél moet doen ?
Is mijn opbouw enigzins verantwoord, of programmeer ik nu alsof ik een gigantisch bord voor m'n kop heb ? Let wel, ik kan redelijk procudereel scripten, maar van OOP heb ik absoluut geen kaas gegeten. Ik ben nu nog jong en fris genoeg om het te leren, en m'n PHP skills mogen wel een nieuwe impuls krijgen. Maar hou het aub begrijpelijk zonder met lastige termen te gaan gooien.
Je kan dan bijvoorbeeld de class db meegeven aan de constructor van het gastenboek. Bijv:
$db = new MySQL('db');
$gb = new Guestbook($db);
class gastenboek {
protected db = null
function leesBerichtenUitDB ($db) {
$sql = $this -> db->query("SELECT * FROM gastenboek");
$berichten = array();
while($result = mysql_fetch_assoc($sql) {
$berichten[] = $result;
}
return $berichten;
}
}
?>
$db = new MySQL('db');
$gb = new Guestbook($db);
class gastenboek {
protected db = null
function leesBerichtenUitDB ($db) {
$sql = $this -> db->query("SELECT * FROM gastenboek");
$berichten = array();
while($result = mysql_fetch_assoc($sql) {
$berichten[] = $result;
}
return $berichten;
}
}
?>
Die or die binnen een class is niet echt netjes. Het is netter om een membervariabele $errors aan te maken. In de constructor doe je dan:
$errors = array ();
Zodra er ergens in je class iets fout gaat, doe je:
array_push ($errors, '<p>Kon geen connectie maken met de database</p>');
Om de errors te laten zien, maak je een get_errors functie die gewoon de array $errors retourneert.
$errors = array ();
Zodra er ergens in je class iets fout gaat, doe je:
array_push ($errors, '<p>Kon geen connectie maken met de database</p>');
Om de errors te laten zien, maak je een get_errors functie die gewoon de array $errors retourneert.
kan je niet met exeptions werken in PHP?
Is het niet dat bij je functies doQuery staat en in de pagina $db->query doet ???
Helaas is deze klasse niets meer dan een langere naamgeving van de functies die standaard in PHP zitten. M.a.w. hij is nogal nutteloos, hij voegt nog niets toe. Ik zou die while-lus ook in de klasse (misschien zelfs wel in de method doQuery al) verwerken, want die lus is vrij algemeen.
En zoals hierboven al gezegd, $db bestaat niet binnen je method leesBerichtenUitDB ;)
En zoals hierboven al gezegd, $db bestaat niet binnen je method leesBerichtenUitDB ;)
Ff de vraagjes tussendoor:
Ja, in PHP , zeker in >5.0 kun je gebruik maken van exceptions.
Over die protected variablen:
Je maakt een variabele private wanneer het de bedoeling is dat deze variable van buiten de klasse niet mogen worden aangepast.
Je maakt een variable protected wanneer sub klasses deze variable mogen aanpassen, maar andere klassen niet.(zie private)
En je maakt ze public als ze van buiten de klassen moeten/mogen worden aangepast
Ja, in PHP , zeker in >5.0 kun je gebruik maken van exceptions.
Over die protected variablen:
Je maakt een variabele private wanneer het de bedoeling is dat deze variable van buiten de klasse niet mogen worden aangepast.
Je maakt een variable protected wanneer sub klasses deze variable mogen aanpassen, maar andere klassen niet.(zie private)
En je maakt ze public als ze van buiten de klassen moeten/mogen worden aangepast




