Starten met OOP.
Ik heb al enkele tuts ivm OOP gevolgd maar het wil mij nog steeds niet lukken.
Ik heb al zitten zoeken en kijken naar oop scripts maar ik geraak er maar niet aan uit. Kan iemand mij misschien een klein scriptje tonen met OOP en zonder OOP dat net hetzelfde doet dan kan ik daar verder uit leren.
Alvast bedankt!
Mvg
Sowieso is het belangrijk dat als je OOP wilt doen, dat je de achterliggende gedachte snapt. Kan jij dus uitleggen hoe dat zit? Zo ja, dan is het een kwestie van dat je het lastig vind om van gedachte in code te komen. Zo nee, dan is het handig om dat eerst uit te vinden.
Ik heb een tut gelezen over he je 'OOP moet denken', dus alle zelfstandige naamwoorden zijn objecten.
Lees anders de tut van blanche nog even? Daarna moet je in staat zijn om een klasse te schrijven. Misschien niet direct in perfect OO. Maar je bent dan i.i.g op weg.
Mvg
PHP jasper op 01/12/2010 19:19:10:
Ik heb een tut gelezen over he je 'OOP moet denken', dus alle zelfstandige naamwoorden zijn objecten.
Naja, dat is wel een beetje kort door de bocht...
Quote:
een beetje kort door de bocht...
Code (php)
'Normaal 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
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
<?php
###############################################
# #
# --- Query 2.0 --- #
# #
# Author: Jasper De Smet #
# Email: [email protected] #
# Website: www.jasperdesmet.be #
# Last edited: 12 November 2010 #
# Version: 2.0 #
# thx: noppes @ PHP-hulp #
# #
###############################################
// zet dit bovenaan het script
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);
// sql debug
define('DEBUG_MODE',true); // true == aan, false == uit
// functie voor sql debug
function showSQLError($sql,$error)
{
echo '<pre>Error: '.$error.'<br />'.$sql.'</pre>';
}
// start van het script
// zet dit waar je query moet
// de query
// let op sql-injectie -> mysql_real_escape_string()
$sql = "SELECT id
FROM ...
WHERE ... = '...'
";
// Check query
if (($result = mysql_query($sql)) === false)
{
// als de query fout is -> foutafhandeling
echo 'Fout met database.';
// geef de error via de functie (bovenaan script)
if (DEBUG_MODE)
{
showSQLError($sql,mysql_error());
}
}
else
{
// De query is gelukt
}
?>
###############################################
# #
# --- Query 2.0 --- #
# #
# Author: Jasper De Smet #
# Email: [email protected] #
# Website: www.jasperdesmet.be #
# Last edited: 12 November 2010 #
# Version: 2.0 #
# thx: noppes @ PHP-hulp #
# #
###############################################
// zet dit bovenaan het script
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);
// sql debug
define('DEBUG_MODE',true); // true == aan, false == uit
// functie voor sql debug
function showSQLError($sql,$error)
{
echo '<pre>Error: '.$error.'<br />'.$sql.'</pre>';
}
// start van het script
// zet dit waar je query moet
// de query
// let op sql-injectie -> mysql_real_escape_string()
$sql = "SELECT id
FROM ...
WHERE ... = '...'
";
// Check query
if (($result = mysql_query($sql)) === false)
{
// als de query fout is -> foutafhandeling
echo 'Fout met database.';
// geef de error via de functie (bovenaan script)
if (DEBUG_MODE)
{
showSQLError($sql,mysql_error());
}
}
else
{
// De query is gelukt
}
?>
De lol van OOP is juist dat je veel meer semantiek, meer dingen die voor jou betekenis hebben in je code introduceert. Iets "dat dingen doet met sql en errors" kan je moeilijk omzetten in objecten. Je kan SQL en errors wel modelleren in objecten, maar dat helpt je niet naar een oplossing voor dat wat je probeert te maken.
hmm, ik snap het nut dus nog steeds niet.. xs
Ok, wat wil je maken?
Ik wil gewoon een beetje oop leren eigenlijk. Ik ben nu een soort van cms systeem aan het maken en iemand zei me dat ik dat beter met oop kon doen. dus toen dacht ik, ik zal me nog is in oop proberen te verdiepen.
Welke classes zou jij nu voor een gastenboek maken? Het hoeft niet heel ingewikkeld met routers en classes om formulieren te genereren etc, en ook mag je nog gewoon normale procedurele code gebruiken om je formulier af te handelen en je gastenboek weer te geven. Maar gewoon simpel een gastenboek waar je berichten uit een database kan tonen. Welke classes zou jij daar nu voor verzinnen? Ik kom er op minstens twee.
reactie en gebruiker denk ik.
(Ik dacht zelf meer aan reactie of bericht, en gastenboek. Bericht bevat het bericht, dwz de inhoud, datum en wie het geschreven heeft en gastenboek doet het opslaan en ophalen van berichten uit de database)
ik dacht reactie dus de inhoud, datum en wie het geschreven heeft en gebruiker ja ik weet niet, dat leek me logisch maar ik snap waarom je reactie of bericht, en gastenboek zou gebruiken
Toevoeging op 02/12/2010 19:47:42:
edit: niet verder geraakt dan dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);
class Reactie
{
public function getReactie()
{
# Mysql query uit database
}
public function __construct($reactie)
{
# schrijf het bericht naar de database.
}
}
?>
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);
class Reactie
{
public function getReactie()
{
# Mysql query uit database
}
public function __construct($reactie)
{
# schrijf het bericht naar de database.
}
}
?>
En verder doe je het niet goed zo. In het model van een gastenboek en reacties, zorgt het gastenboek voor de opslag en is de reactie zelf slechts een houder van de inhoud van de reactie. Ik hoop dat ik Jelmer's lesprogramma niet in de war schop, maar denk hieraan:
Vergeet de constructor heel even
Bedenk welke 'eigenschappen' een reactie kan hebben en zorg dat deze opgehaald en ingesteld kunnen worden.
En denk eraan dat het model (ongeveer) hetzelfde zou moeten werken mét of zonder 'persistence', de continuïteit door de reqeust heen, die je met je DB bereikt.
En mocht ik iets fout zeggen, verbeter me alsjeblieft :)
PHP jasper op 02/12/2010 19:29:37:
# Mysql query uit database
[...]
# schrijf het bericht naar de database.
[...]
# schrijf het bericht naar de database.
Ik zei je nog expliciet niet over de implementatie na te denken :P Want dat is wat je nu normaal doet, en wat je gewend bent te doen. In mijn voorbeeld zie je ook niet hoe of waarvandaan ik die Post objecten bij Topic::posts haal, dat komt allemaal later, en dat is eigenlijk niet eens zo belangrijk.
Misschien een stapje makkelijker, ik noem een aantal taken die gedaan moeten worden binnen een gastenboek voordat het een gastenboek is. Je hebt twee classes, Gastenboek en Reactie. (je mag zoveel instanties van die classes maken als je zelf wilt)
Ok, de taken:
- naam auteur onthouden
- een reactie onthouden
- inhoud reactie onthouden
- reacties terugvinden
- een reactie verwijderen
Dit is echt te makkelijk, maar het gaat erom dat je begint te denken in dingen met verantwoordelijkheden in plaats van in stappen die dit daadwerkelijk doen.
Kan je nu de interfaces (de class zonder de inhoud, zoals ik hierboven met Topic deed) geven voor Gastenboek en Reactie?
En, geen idee of dat makkelijker is, kan je nu ongeveer schrijven hoe je Gastenboek de verschillende instanties van Reactie nu met elkaar zou laten praten? (als in roep je een method van je Gastenboek-instantie aan en geef je hem een Reactie instantie mee, of andersom, en hoe zou je de berichten uit het gastenboek tonen? Het enige wat je mag gebruiken is methods van Gastenboek en Reactie, echo, foreach en variabelen. De rest heb je niet nodig, of zijn op dit moment nog niet interessant.
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
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
<?php
# TITEL: JASPER OEFENT OOP - GASTENBOEK @ phphulp : http://www.phphulp.nl/php/forum/topic/starten-met-oop/74690/
/*
class GASTENBOEK
- reacties ophalen
- reacties deleten waar het id == $id
class REACTIE
- id van reactie ophalen
- auteur van reactie ophalen
- inhoud van reactie ophalen
ONTBREEKT
-naam auteur onthouden
- een reactie onthouden
*/
class Gastenboek
{
public function reacties()
{
return array(
new Post('reactie1'),
new Post('reactie2'),
new Post('reactie3'),
new Post('reactie4'));;
}
public function delete_reactie($id)
{
return "Starten met OOP.";
}
}
class Reactie
{
public function id()
{
return 1;
}
public function auteur()
{
return 'Jasper';
}
public function inhoud()
{
return 'Hallo, ik ben jasper, leuk gastenboek';
}
}
?>
# TITEL: JASPER OEFENT OOP - GASTENBOEK @ phphulp : http://www.phphulp.nl/php/forum/topic/starten-met-oop/74690/
/*
class GASTENBOEK
- reacties ophalen
- reacties deleten waar het id == $id
class REACTIE
- id van reactie ophalen
- auteur van reactie ophalen
- inhoud van reactie ophalen
ONTBREEKT
-naam auteur onthouden
- een reactie onthouden
*/
class Gastenboek
{
public function reacties()
{
return array(
new Post('reactie1'),
new Post('reactie2'),
new Post('reactie3'),
new Post('reactie4'));;
}
public function delete_reactie($id)
{
return "Starten met OOP.";
}
}
class Reactie
{
public function id()
{
return 1;
}
public function auteur()
{
return 'Jasper';
}
public function inhoud()
{
return 'Hallo, ik ben jasper, leuk gastenboek';
}
}
?>
@ jelmer, is deze opzet beter?
Gewijzigd op 23/12/2010 14:47:02 door Jasper DS