Why use OOP?
Pagina: « vorige 1 2 3 4 5 volgende »
Een klein voorbeeldje:
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
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
<?php
class Gastenboek
{
protected $iPage;
public function __construct($iPage)
{
$this->iPage = $iPage;
}
public function getPage()
{
return $this->iPage;
}
public function setPage($iPage)
{
$this->iPage = $iPage;
}
}
$oGastenboek = new Gastenboek(19);
echo 'You are on page '.$oGastenboek->getPage().'<br />';
$oGastenboek->setPage(20);
echo 'You are on page '.$oGastenboek->getPage().'<br />';
?>
class Gastenboek
{
protected $iPage;
public function __construct($iPage)
{
$this->iPage = $iPage;
}
public function getPage()
{
return $this->iPage;
}
public function setPage($iPage)
{
$this->iPage = $iPage;
}
}
$oGastenboek = new Gastenboek(19);
echo 'You are on page '.$oGastenboek->getPage().'<br />';
$oGastenboek->setPage(20);
echo 'You are on page '.$oGastenboek->getPage().'<br />';
?>
Die variabele $iPage in dit stukje hierboven krijgt dus automatisch de waarde 19 of in andere geval 20 ?
Als je namelijk een nieuwe instantie van een klasse aanmaakt wordt altijd de methode __construt() van die klasse uitgevoerd. Nu accepteert deze methode 1 parameter $iPage. De waarde van deze parameter wordt vervolgens door de functie toegekend aan de member $iPage van de klasse.
Met behulp van de methode setPage() die ik op regel 25 aanroep, geef ik daar de member $iPage een nieuwe waarde. Dat valt ook te zien in de verschillen in output als je het scriptje runt.
Al tijd mee bezig maar lukt niet:
Code (php)
In het gewone php gedeelte heb ik dit:
Code (php)
1
2
3
2
3
$gastenboek = new gastenboek($pagina_nummer);
$gastenboek->weergeven();
print_r($gastenboek->fetch);
$gastenboek->weergeven();
print_r($gastenboek->fetch);
Alleen nu weergeeft hij niks..
Als ik ipv return $this->fetch; gewoon echo $this->fetch; doe doet hij het wel, maar dan weergeeft hij alles uitzichzelf meteen dat is niet de bedoeling.. ziet iemand wat ik fout doe?
Gewijzigd op 01/01/1970 01:00:00 door Vincent
Je hebt nergens een LIMIT opgenomen in je query?
Je foreachloop zelf klopt ook niet. Zoals gezegd al vanwege die return, maar ook zet je de inhoud van de array in een variabele $fetch die je vervolgens niet meer gebruikt?
In je PHP script roep je een methode weergeven() aan? Waar is die methode?
ps. @Crispijn: dat mag niets uitmaken. Nu worden gewoon alle berichten opgehaald...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Gewijzigd op 01/01/1970 01:00:00 door Vincent
Vincent schreef op 06.02.2008 20:19:
ik heb maar klein stukje gepost dat lijkt me logisch want je krijgt normaal ook: Post relevante code om je hoofd geslingerd. Maar blanche ik wil alle gegevens in een array weggeven zodat ik ze kan aanpassen in gewone script zodat ik layout niet hoef op te nemen in mn oop stuk, hoe doe ik dat?
Normaal gesproken bij procedureel programmeren is dat handiger idd, maar in het geval van OOP is het wat handiger om te zien hoe je alles hebt opgebouwd en dus ook de methoden post.
Quote:
Klopt, maar in dit geval zijn dat wel degelijk relevante onderdelen ;-)Post relevante code om je hoofd geslingerd.
Maar goed, je kunt tijdens het fetchen toch gewoon een array aanmaken en deze vervolgens retourneren?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
public function getMessages()
{
// Query uitvoeren en checken...
$aMessages = array();
while($row = mysql_fetch_assoc($res))
{
$aMessages[] = $row;
}
return $aMessages;
}
?>
public function getMessages()
{
// Query uitvoeren en checken...
$aMessages = array();
while($row = mysql_fetch_assoc($res))
{
$aMessages[] = $row;
}
return $aMessages;
}
?>
Of natuurlijk aangepast naar de werking van jouw database klasse.
ps. In je PHP script zou je de array dus zo verkrijgen:
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
@Blanche, omg ik ben zo dom dat ik daar niet aan gedacht heb =) ik ga t meteen maken =)
Mn eerste stuk is af!
Het bekijken alle gegevens =D( nog wel zonder paginanummering )
Heb erg mn best op gedaan =) hoor graag commentaar en natuurlijk ook positieve reacties.
Hier is ie dan!
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
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
<?php
class gastenboek
{
protected $aantal_paginas;
protected $sql;
protected $db;
protected $gegevens;
public $fetch;
public $berichten;
public $row;
public function __construct($pagina)
{
$this->pagina = $pagina;
$this->connectie();
}
protected function connectie(){
try{
$this->db = new PDO('pgsql:host=sterretjes;dbname=sterretjes', 'sterretjes', 'sterretjes');
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function weergeven()
{
if($this->num_rows() == 0){
echo "Er zijn nog geen berichten ingevoegd.";
}else{
$this->sql = "SELECT * FROM berichten";
$this->gegevens = $this->db->query($this->sql);
foreach($this->gegevens as $fetch){
$berichten[] = $fetch;
}
return $berichten;
}
}
public function num_rows()
{
try
{
$this->sql = "SELECT count(id) AS aantal FROM berichten";
$this->aantal_paginas = $this->db->query($this->sql);
foreach($this->aantal_paginas as $row){
return $row['aantal'];
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function getpagina()
{
return $this->pagina;
}
public function setpagina($pagina)
{
$this->pagina = $pagina;
}
}
$gastenboek = new gastenboek($pagina_nummer);
$gegevens = $gastenboek->weergeven();
foreach($gegevens as $gegevens_naar_browser){
echo "
ID ".$gegevens_naar_browser['id']."#<br />
Door: <a href=\"mailto:".$gegevens_naar_browser['email']."\">".$gegevens_naar_browser['naam']."</a>
Op: ".$gegevens_naar_browser['datum']."<br />
Bericht: <br />".$gegevens_naar_browser['bericht']."
<br /><br />
";
}
?>
class gastenboek
{
protected $aantal_paginas;
protected $sql;
protected $db;
protected $gegevens;
public $fetch;
public $berichten;
public $row;
public function __construct($pagina)
{
$this->pagina = $pagina;
$this->connectie();
}
protected function connectie(){
try{
$this->db = new PDO('pgsql:host=sterretjes;dbname=sterretjes', 'sterretjes', 'sterretjes');
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function weergeven()
{
if($this->num_rows() == 0){
echo "Er zijn nog geen berichten ingevoegd.";
}else{
$this->sql = "SELECT * FROM berichten";
$this->gegevens = $this->db->query($this->sql);
foreach($this->gegevens as $fetch){
$berichten[] = $fetch;
}
return $berichten;
}
}
public function num_rows()
{
try
{
$this->sql = "SELECT count(id) AS aantal FROM berichten";
$this->aantal_paginas = $this->db->query($this->sql);
foreach($this->aantal_paginas as $row){
return $row['aantal'];
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function getpagina()
{
return $this->pagina;
}
public function setpagina($pagina)
{
$this->pagina = $pagina;
}
}
$gastenboek = new gastenboek($pagina_nummer);
$gegevens = $gastenboek->weergeven();
foreach($gegevens as $gegevens_naar_browser){
echo "
ID ".$gegevens_naar_browser['id']."#<br />
Door: <a href=\"mailto:".$gegevens_naar_browser['email']."\">".$gegevens_naar_browser['naam']."</a>
Op: ".$gegevens_naar_browser['datum']."<br />
Bericht: <br />".$gegevens_naar_browser['bericht']."
<br /><br />
";
}
?>
P.s Misschien zitten er nog wat schoonheidsfoutjes in die ik ben vergeten eruit te halen
Gewijzigd op 01/01/1970 01:00:00 door Vincent
Regel 5-12: De member $sql is niet nodig. De query stel je op in een variabele in een methode, hier hoef je geen class member voor te gebruiken. Je zult dezelfde query immers niet in andere methoden gebruiken. Zelfde geldt voor $gegevens. Verder gebruik je $fetch en $row en $berichten nergens dus die zijn overbodig.
Regel 26: een typisch beginnersfoutje, een echo wil je liever niet in je klasse hebben. Ofwel je gooit hier een nieuwe exception ofwel je gebruikt hier nog geen try/catch combinatie en laat een eventuele PDOException nog even onafgevangen.
Regel 33: zelfde als hierboven. In zo'n geval zou je een Exception moeten gooien.
Regel 35-36: gebruik hier gewoon $sql en $gegevens. Nergens voor nodig om class members te gebruiken.
Regel 49: het lijkt me dat $aantal_paginas een integer moet zijn. Ga aan deze member in ieder geval niet het resultaat van deze query toekennen, gebruik gewoon $result oid.
Regel 57: zelfde als regel 26.
Regel 72-83: Giet dit in een try/catch constructie en vang de gegooide Exceptions (evt. PDOException) af.
Dit zijn allemaal kleine beginnersfoutjes, er zitten gelukkig geen grote constructie fouten in. Netjes hoor...
Regel 5-12 - Ik heb ze gedelet =)
Regel 26, Regel 33, Regel 57 - Wat bedoel je hier precies? Gewoon dit:
veranderen naar
of naar
Regel 72-83 - Toegevoegd !
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
try
{
$oGastenboek = new gastenboek($pagina);
// Doe dingen met je gastenboek
}
catch(PDOException $e)
{
// Handel je PDOException af
}
catch(Exception $e)
{
// Handel eventuele andere Exceptions die je
// gegooid hebt af...
}
?>
try
{
$oGastenboek = new gastenboek($pagina);
// Doe dingen met je gastenboek
}
catch(PDOException $e)
{
// Handel je PDOException af
}
catch(Exception $e)
{
// Handel eventuele andere Exceptions die je
// gegooid hebt af...
}
?>
In het geval van regel 32 zou je de echt door zoiets moeten vervangen:
Je moet er in ieder geval voor zorgen dat alle Exceptions die ooit gegooid kunnen worden, ergens in je script afgevangen. Anders krijg je een erg lelijke foutmelding en dat wil je niet ;-)
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Bye
Die exeptions, dat is eigelijk een soort vuilnisbak waar je al je errors in verzameld? En waarom spoor je die op met try? je kan toch gewoon heel duidelijk de 'spaghetti methode' gebruiken. Dus
of is dat niet zoals het in classes gedaan wordt? of komt dat doordat Vincent een pdo klasse gebruikt?
Ben benieuwd!
Cris
Het geven van foutmeldingen als er bijvoorbeeld geen berichten zijn, doe je dus ook niet met een echo maar je gooit een Exception. Bij het uitvoeren van je script met je try/catch combinatie kun je deze afvangen en bepalen hoe je de fout af wilt handelen.
Exceptions in PHP5
Zie ook dit en volgende hoofdstukken in mijn tutorial over foutafhandeling in PHP.
Slaap wel allemaal! Morgen weer een dag OOP ;)
Code (php)
Waarbij je in het catch blok zowel de 1e als 2e exeption te zien krijgt als die hem gooit? Hij maakt er een soort van array van ofzo?
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Zover ik weet kan je alleen de eerstvoorkomende Exception terugkrijgen.
Want zodra er een exception word gethrowed kapt die ermee en gaat die naar het catch blok.