[OOP] Telefoonboek
Ik ben weer een beetje aan het proberen met OOP en vroeg me af of het volgende goed was? Opmerkingen en (opbouwende) kritiek zijn altijd welkom!
index.php
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
require('class_Database.php');
require('class_Telefoonboek.php');
require('class_TelefoonboekRecord.php');
$telefoonboek = new Telefoonboek;
$message = $telefoonboek->initiate();
$records = $telefoonboek->getAllRecords();
?>
<HTML>
<HEAD>
<TITLE>Telefoonboek</TITLE>
</HEAD>
<BODY>
<?php
if(!empty($message)){
echo $message . '<br><br>';
}
if(!$records){
echo 'Er zijn geen nummers gevonden.';
}else{
?>
<TABLE>
<TR>
<TD STYLE='width: 200px; font-weight: bold;'>Name</TD>
<TD STYLE='width: 200px; font-weight: bold;'>Number</TD>
</TR>
<?php
for($i = 0; $i < count($records); $i++){
echo '<TR>';
echo '<TD>' . $records[$i]->getName() . '</TD>';
echo '<TD>' . $records[$i]->getNumber() . '</TD>';
echo '</TR>';
}
?>
</TABLE>
<?php
}
?>
<br><br><br><br>
<FORM ACTION='' METHOD='POST'>
<TABLE>
<TR>
<TD>Name:</TD>
<TD><INPUT TYPE='text' NAME='name'></TD>
</TR>
<TR>
<TD>Number:</TD>
<TD><INPUT TYPE='text' NAME='number'></TD>
</TR>
<TR>
<TD COLSPAN='2'><br><INPUT TYPE='submit' NAME='submit' VALUE='Voeg Toe'></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
require('class_Database.php');
require('class_Telefoonboek.php');
require('class_TelefoonboekRecord.php');
$telefoonboek = new Telefoonboek;
$message = $telefoonboek->initiate();
$records = $telefoonboek->getAllRecords();
?>
<HTML>
<HEAD>
<TITLE>Telefoonboek</TITLE>
</HEAD>
<BODY>
<?php
if(!empty($message)){
echo $message . '<br><br>';
}
if(!$records){
echo 'Er zijn geen nummers gevonden.';
}else{
?>
<TABLE>
<TR>
<TD STYLE='width: 200px; font-weight: bold;'>Name</TD>
<TD STYLE='width: 200px; font-weight: bold;'>Number</TD>
</TR>
<?php
for($i = 0; $i < count($records); $i++){
echo '<TR>';
echo '<TD>' . $records[$i]->getName() . '</TD>';
echo '<TD>' . $records[$i]->getNumber() . '</TD>';
echo '</TR>';
}
?>
</TABLE>
<?php
}
?>
<br><br><br><br>
<FORM ACTION='' METHOD='POST'>
<TABLE>
<TR>
<TD>Name:</TD>
<TD><INPUT TYPE='text' NAME='name'></TD>
</TR>
<TR>
<TD>Number:</TD>
<TD><INPUT TYPE='text' NAME='number'></TD>
</TR>
<TR>
<TD COLSPAN='2'><br><INPUT TYPE='submit' NAME='submit' VALUE='Voeg Toe'></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
class_Telefoonboek.php
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
class Telefoonboek {
public function initiate() {
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$check = $this->checkValues();
if($check){
if($this->addRecord()){
return 'Het nummer is succesvol toegevoegd.';
}else{
return 'Het nummer kon niet worden toegevoegd.';
}
}else{
return $check;
}
}
}
protected function checkValues() {
$error = '';
if(strlen($_POST['name']) < 4 || strlen($_POST['number'] > 200)){
$error .= 'Controleer de ingevoerde naam.<br>';
}
if(!is_numeric($_POST['number']) || strlen($_POST['number']) < 4 || strlen($_POST['number']) > 25){
$error .= 'Controleer het ingevoerde telefoonnummer.<br>';
}
if(!empty($error)){
return $error;
}
return true;
}
protected function addRecord(){
$database = new Database;
$database->connect();
$sql = 'INSERT INTO telefoonboek SET name="' . mysql_real_escape_string($_POST['name']) . '", number="' . mysql_real_escape_string($_POST['number']) . '"';
$result = $database->makeRow($sql);
$database->disconnect();
if(!$result){
return false;
}
return true;
}
public function getAllRecords() {
$database = new Database;
$database->connect();
$sql = 'SELECT * FROM telefoonboek';
$count = $database->countRows($sql);
if($count > 0){
$rows = $database->getRows($sql);
for($i = 0; $i < count($rows); $i++){
$record = new TelefoonboekRecord;
$record->setId($rows[$i]['id']);
$record->setName($rows[$i]['name']);
$record->setNumber($rows[$i]['number']);
$records[] = $record;
}
$database->disconnect();
return $records;
}else{
$database->disconnect();
return false;
}
}
public function getRecord($id) {
$database = new Database;
$database->connect();
$sql = 'SELECT * FROM telefoonboek WHERE id="' . mysql_real_escape_string($id) . '"';
$count = $database->countRows($sql);
if($count == 1){
$row = $database->getRow($sql);
$record = new TelefoonboekRecord;
$record->setId($row['id']);
$record->setName($row['name']);
$record->setNumber($row['number']);
$database->disconnect();
return $record;
}else{
$database->disconnect();
return false;
}
}
}
?>
class Telefoonboek {
public function initiate() {
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$check = $this->checkValues();
if($check){
if($this->addRecord()){
return 'Het nummer is succesvol toegevoegd.';
}else{
return 'Het nummer kon niet worden toegevoegd.';
}
}else{
return $check;
}
}
}
protected function checkValues() {
$error = '';
if(strlen($_POST['name']) < 4 || strlen($_POST['number'] > 200)){
$error .= 'Controleer de ingevoerde naam.<br>';
}
if(!is_numeric($_POST['number']) || strlen($_POST['number']) < 4 || strlen($_POST['number']) > 25){
$error .= 'Controleer het ingevoerde telefoonnummer.<br>';
}
if(!empty($error)){
return $error;
}
return true;
}
protected function addRecord(){
$database = new Database;
$database->connect();
$sql = 'INSERT INTO telefoonboek SET name="' . mysql_real_escape_string($_POST['name']) . '", number="' . mysql_real_escape_string($_POST['number']) . '"';
$result = $database->makeRow($sql);
$database->disconnect();
if(!$result){
return false;
}
return true;
}
public function getAllRecords() {
$database = new Database;
$database->connect();
$sql = 'SELECT * FROM telefoonboek';
$count = $database->countRows($sql);
if($count > 0){
$rows = $database->getRows($sql);
for($i = 0; $i < count($rows); $i++){
$record = new TelefoonboekRecord;
$record->setId($rows[$i]['id']);
$record->setName($rows[$i]['name']);
$record->setNumber($rows[$i]['number']);
$records[] = $record;
}
$database->disconnect();
return $records;
}else{
$database->disconnect();
return false;
}
}
public function getRecord($id) {
$database = new Database;
$database->connect();
$sql = 'SELECT * FROM telefoonboek WHERE id="' . mysql_real_escape_string($id) . '"';
$count = $database->countRows($sql);
if($count == 1){
$row = $database->getRow($sql);
$record = new TelefoonboekRecord;
$record->setId($row['id']);
$record->setName($row['name']);
$record->setNumber($row['number']);
$database->disconnect();
return $record;
}else{
$database->disconnect();
return false;
}
}
}
?>
class_TelefoonboekRecord.php
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
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
<?php
class TelefoonboekRecord {
protected $id, $name, $number;
function __contruct() {
$this->id = 0;
$this->name = '';
$this->number = '';
}
public function setId($id) {
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function setNumber($number) {
$this->number = $number;
}
public function getNumber() {
return $this->number;
}
}
?>
class TelefoonboekRecord {
protected $id, $name, $number;
function __contruct() {
$this->id = 0;
$this->name = '';
$this->number = '';
}
public function setId($id) {
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function setNumber($number) {
$this->number = $number;
}
public function getNumber() {
return $this->number;
}
}
?>
Groetjes!
Gewijzigd op 01/01/1970 01:00:00 door Tim
class Telefoonboek extends Database
Telefoonboek is namelijk geen database, maar een tabel. Dus deze extend klopt niet.
2. Je TelefoonboekRecord lijkt er al meer op, al is dat uiteraard gewoon een simpele wrapper
3. Alle $_POST-handelingen horen absoluut niet thuis in deze class. $_POST is iets specifieks van je applicatie, namelijk validatie, en hoort niet gemengd te worden met databasehandelingen. Je instantiate(), checkValues() en addRecord() kunnen dus echt niet op die manier.
Tip: bij addRecord() kun je een TelefoonboekRecord-object mee laten geven. Dus addRecord(TelefoonboekRecord $record). Dan zie je al dat je logisch bezig bent, want je definieert de waarden elders. Er zijn echter honderd manieren om databaseobjecten te maken. Ik zou zeggen Google ook eens op DAO (data access object).
4. Je getAllRecords() zou je statisch kunnen maken. Hij is namelijk niet echt afhankelijk van properties binnen je object en manipuleert je object ook niet. Maar dan moet je wel kijken hoe je je connectie meegeeft. Maar als je punt 1 hierboven leest dan zie je ook dat je eigenlijk niet moet extenden van Database.
Hier een voorbeeldje van in welke richting ik meer zou kijken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Ik zou zelf een nog andere opzet gebruiken maar die gaat een beetje langs jouw aanpak heen terwijl jouw aanpak niet per se slechter is.
Ik zou in de TelefoonboekRecord-class al een insert-optie maken en het Telefoonboek-object houden om bijv. meerdere records op te vragen.
Daarnaast zou ik het database-object ophalen met een statische functie uit bijvoorbeeld een registry. Zoiets als $this->_db = Registry::get('db'); Dan hoef je dit niet steeds mee te geven. Je kunt dan ook makkelijker statische functies gebruiken.
Voor alle $_POST-dingen zul je aparte validatieobjecten "moeten" maken. Deze objecten zouden wel gebruik kunnen maken van bijvoorbeeld TelefoonboekRecord om bijvoorbeeld te zien welke velden worden verwacht.
Oke veel commentaar maar ik vind het zeker niet slecht.
Edit:
Oh, oh, en errors return je niet in een lijst, daar gooi je Exceptions voor. Bij validatie heb je echter goed gezien dat je misschien een errorlijst wil. Maar ik zou niet ervoor kiezen om één functie óf true óf een errorlist te laten returnen. Ik zou eerder een ->isValid() method maken, en bij false, een getErrors() method. Maar dan dus wel ergens in een validatieobject. Zie ook voor de grap eens een pagina uit een tutorial die ik ooit heb geschreven: http://phphulp.nl/php/tutorials/8/632/1667/
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
Dat extenden van de database was een foutje uit een eerdere versie. Zoals je verder ziet in de methods gebruikte ik deze extend in principe niet. Hij is eruit en ik had hem er al 'uitgedacht'.
De rest zal ik meenemen in een volgende versie!
Bekijk ook eens wat frameworks zoals Zend, symfony en CakePHP om te zien wat voor standaardobjecten zij definiëren. Het is vaak al leerzaam te weten waar men aparte objecten voor gebruikt.
Good luck.
edit: overigens kun je dit object absoluut gewoon Telefoonboek noemen hoor, als je maar altijd in je achterhoofd houdt wat "Telefoonboek" dan precies betekent.
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
Thanks, ik ga er mee aan de slag!