login  Naam:   Wachtwoord: 
Registreer je!
 Forum

OOP oefen opdrachten

Offline beronne - 21/10/2012 15:42
Avatar van beronneLid Beste Lezers

Ik heb een complete tutorial gevoeld over OOP via http://www.killerphp.com.
Ik heb filmpjes bekeken een pdf gelezen en heb mee
geprogrammeerd met de voorbeelden en begin het nu eindelijk te snappen.

Aan het eind zegt de maker van de tutorial dat je nu oefen opdrachten
moet maken om het nu verder te leren.

Mijn vraag aan jullie is: weten jullie leuke en leerzame oefen opdrachten die ik kan maken
waarbij ik eerst nog niks met een datebase hoef te doen.
Als ik de basis echt goed snap en geen moeite meer mee hebt wou ik verder gegaan
om met OOP opdrachten te maken waarbij een database om de hoekt komt kijken.

Alvast bedankt.

8 antwoorden

Gesponsorde links
Offline marten - 22/10/2012 08:39
Avatar van marten Beheerder Ik wil je wel een opdracht geven. Zal hem na de tijd voor je 'nakijken' en je tips geven

Opdracht:
Maak een script voor een garage. Ze behandelen auto's, vrachtauto's, scooters en snorfietsen. Ze hebben een script nodig welke ze assisteert bij de assemblage van deze vier.


Mocht je meer informatie nodig hebben hoor ik het wel
Offline beronne - 22/10/2012 23:50
Avatar van beronne Lid
marten schreef:
Ik wil je wel een opdracht geven. Zal hem na de tijd voor je 'nakijken' en je tips geven

Opdracht:
Maak een script voor een garage. Ze behandelen auto's, vrachtauto's, scooters en snorfietsen. Ze hebben een script nodig welke ze assisteert bij de assemblage van deze vier.


Mocht je meer informatie nodig hebben hoor ik het wel


Zou je wat meer informatie kunnen geven lijkt me namelijk een uitdaging om dit te proberen.
Maar hoe en wat en waar ik moet beginnen weet ik zo niet. Dus misschien een opstart zoals maak pagina waar je onder kan toevoegen aan auto's vrachtauto's scooters en snorfietsen..... enz

Als vast bedankt voor deze opdracht
Offline marten - 24/10/2012 08:36
Avatar van marten Beheerder Ik geef 1 hint: denk in objecten. Wat de daadwerkelijke uitkomst is maakt me niet heel veel uit. Maak bijvoorbeeld maar iets wat de onderdelen van de assemblage per productgroep terug geeft. Hou er rekening mee dat er meerdere producten zijn dus meerdere auto's meerdere scooters etc.
Offline beronne - 24/10/2012 15:15 (laatste wijziging 31/10/2012 17:45)
Avatar van beronne Lid Beste mensen ik heb de class dan eindelijk af.
Hij is te zien op: OOP garage assemblage
Ik zou eest wat uitleg geven over de structuur van de oefen opdracht.

Ik heb 1 pagina met 2 selects, 1 select voor de categorieën: auto, vrachtauto, scooter, snorfiets. Ik heb het zo gemaakt dat als je in de eerste select een cat kiest, dat ajax de id stuur naar ajax.php die de id weer naar de class stuurt en die returnt de bijbehorende merken.

Voorbeeld:
selectbox 1: auto's
selectbox 2: audi, bww, etc, etc..

Alle waardes voor select box 1 en 2 staan in een database. De database bestaat uit 3 tabellen:
- categorie = auto, vrachtauto, scooter, snorfiets
- merken = alle merken voor auto, vrachtauto, scooter, snorfiets
- onderdelen = alle onderdelen voor auto, vrachtauto, scooter, snorfiets

indeling site:
- index.php
Op index.php include ik de class en maak een object aan.
Daarna maak ik verbinden met de db en include ik de view/showgarage.php.
Hierna sluit ik de db weer.

- view/showgarage.php
In de showgrage.php is de opmaak qwa html forms etc. deze wordt ge include
in index.php

- classes/class_Garage.php
Dit is de class waar alles gebeurt.

- ajax.php
ajax.php zorgt ervoor dat het 2de selectbox wordt gevuld met de waarde
die gekoppeld zijn aan het eerste selectbox.

- js/jquery1.8.2.js
Om ervoor te zorgen dat ajax het doet.

- css/stye.css
Om de boel een beetje te stylen

En dan nu de daadwerkelijke code:
index.php
  1. <?php
  2. // Include class_Garage.php
  3. include_once("classes/class_Garage.php");
  4.  
  5. // Nieuw object aanmaken Garage
  6. $garage = new Garage();
  7.  
  8. // Database verbinding maken
  9. $connect = $garage->connect("localhost", "root", "", "garage");
  10.  
  11. // Include de view voordat de verbinding wordt verbroken
  12. // anders kunnen we geen data vanuit de db er weergeven
  13. include_once("view/showgarage.php");
  14.  
  15. // Database verbinding verbreken
  16. $disconnect = $garage->disconnectDb();


view/showgarage.php
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Garage Assemblage</title>
  6. <link rel="stylesheet" href="css/style.css" type="text/css">
  7. <script src="js/jquery1.8.2.js" type="text/javascript"></script>
  8. <script>
  9. $(document).ready(function() {
  10.  
  11. $("#product").change(function(){
  12. var id = "id="+ $("#product option:selected").attr('value');
  13. //alert(id);
  14.  
  15. $.ajax({
  16. type: "POST",
  17. url: "ajax.php",
  18. data: id,
  19. cache: false,
  20. success: function(data){
  21. $("#type_product").html(data)
  22. }
  23. });
  24. });
  25. });
  26. </script>
  27. </head>
  28.  
  29. <body>
  30. <h1>Garage Assemblage</h1>
  31. <hr />
  32. <form method="post" action="">
  33.  
  34. <select class="selectbox" name="categorie" id="product">
  35. <option value="none">Kies categorie</option>
  36. <?=$setcat = $garage->setCat();?>
  37. </select>
  38.  
  39. <select class="selectbox" name="merk" id="type_product">
  40. <option value="none">Kies eerst een categorie</option>
  41. </select>
  42. <input type="submit" class="button" value="Toon onderdelen" name="submit" />
  43. </form>
  44. <hr />
  45. <?= (isset($_POST["submit"]) ? $garage->showParts($_POST["categorie"], $_POST["merk"]) : "")?>
  46. </body>
  47. </html>


class_Garage.php
  1. <?php
  2. /**
  3.  * Garage Assemblage class
  4.  *
  5.  * Het doel van deze class is om een
  6.  * een overzicht te generen voor een garage.
  7.  * Als de garage een product willen assembleren,
  8.  * hebben ze een overzicht nodig met welke onderdelen
  9.  * ze moeten gebruiken.
  10.  *
  11.  * Op dit moment heeft de garage 4 producten:
  12.  * Auto, Vrachtauto's Scooters en Snorfietsen
  13.  * Een auto kan uit meerdere types bestaan: audie, bmw etc.
  14.  *
  15.  * Aan deze types zijn weer onderdelen gekoppeld:
  16.  * Voorbeeld onderdelen Audie: stuur, audie logo etc.
  17.  */
  18. class Garage{
  19.  
  20. /*
  21. Properties (variablen)
  22. */
  23. private $host;
  24. private $username;
  25. private $password;
  26. private $database;
  27. private $con; // Verbdingen db maken en verbreken
  28.  
  29. /*
  30. Methoden (Functies)
  31. */
  32. public function connect($set_host, $set_username, $set_password, $set_database){
  33. $this->host = $set_host;
  34. $this->username = $set_username;
  35. $this->password = $set_password;
  36. $this->database = $set_database;
  37.  
  38. $this->con = mysql_connect($this->host, $this->username, $this->password)or die("Kan geen verbinding maken");
  39. mysql_select_db($this->database) or die("Kan geen DB selecteren");
  40. }
  41.  
  42. public function setCat(){
  43. $option = "";
  44. $sql = "SELECT id, naam FROM categorie ORDER BY naam ASC";
  45. $result = mysql_query($sql);
  46. while ($row = mysql_fetch_assoc($result)){
  47. $option .= "<option value=".$row["id"].">".$row["naam"]."</option>";
  48. }
  49. return $option;
  50. }
  51.  
  52. public function setMerk($id){
  53. if($id == "none"){
  54. $option = "<option value=\"none\">Kies eerst een categorie</option>";
  55. } else {
  56. $option = "";
  57. $option = "<option value=\"none\">Kies merk</option>";
  58.  
  59. $sql = "SELECT id, naam FROM merken WHERE cat_id = ".$id." ORDER BY naam ASC";
  60. $result = mysql_query($sql);
  61. while ($row = mysql_fetch_assoc($result)){
  62. $option .= "<option value=".$row["id"].">".$row["naam"]."</option>";
  63. }
  64. }
  65. return $option;
  66. }
  67.  
  68. public function showParts($cat_id, $merk_id){
  69. $sql = "SELECT id, onderdeel, omschrijving, prijs FROM onderdelen WHERE merk_id =".$merk_id." AND cat_id =".$cat_id;
  70. $result = mysql_query($sql);
  71.  
  72. if($result == false){
  73. // Doe niks
  74. } elseif(mysql_num_rows($result) == 0) {
  75. return "<p>Geen restultaten gevonden</p>";
  76. } else {
  77. // Start tabel
  78. $table = "<table class=tab_onderdeel border=1 cellspacing=0>";
  79. $table .= "<tr>";
  80.  
  81. // Teller voor number off fields
  82. $count = mysql_num_fields($result);
  83.  
  84. // Header tabel
  85. for($i = 0; $i < $count; $i++){
  86. $field_name = mysql_field_name($result, $i);
  87. $table .= "<th>".$field_name."</th>";
  88. }
  89.  
  90. $table .= "</tr>";
  91. $table .= "<tr>";
  92.  
  93. // Body tabel
  94. $totaal = 0; // Teller voor totaal optellen
  95. while($row = mysql_fetch_object($result)){
  96. $totaal += $row->prijs; // Replace . for ,
  97. for($i = 0; $i < $count; $i++){
  98. $field_name = mysql_field_name($result, $i);
  99. // Check om prijs class appart te stylen
  100. if($field_name == "prijs"){
  101. $table .= "<td class=prijs>&euro; ".number_format($row->$field_name, 2, ",", "")."</td>";
  102. } else {
  103. $table .= "<td>".$row->$field_name."</td>";
  104. }
  105. }
  106. $table .= "</tr>";
  107. }
  108. $table .= "<tr class=totaal><td>Totaal</td><td></td><td></td><td>&euro; ".number_format($totaal, 2, ",", "")."</td></tr>";
  109. $table .= "</table>";
  110. return $table;
  111. }
  112. }
  113.  
  114. public function disconnectDb(){
  115. mysql_close($this->con);
  116. }
  117. }


ajax.php
  1. <?php
  2. /**
  3.  * AJAX REQUESTS
  4.  *
  5.  * Afhandelen van alle Ajax
  6.  * requests worden hier opgevangen
  7.  * en naar de class gestuurd die stuurt
  8.  * weer een return terug naar ajax.php
  9.  * waarna Jquery ajax succes function die data
  10.  * hiervan ophaald.
  11.  */
  12.  
  13. // Include class_Garage.php
  14. include_once("classes/class_Garage.php");
  15.  
  16. // Nieuw object aanmaken Garage methods
  17. // te kunnen gebruiken
  18. $garage = new Garage();
  19.  
  20. // Database verbinding maken
  21. $connect = $garage->connect("localhost", "root", "", "garage");
  22.  
  23. // Kijken of id is gezet
  24. if(isset($_POST["id"])){
  25. echo $setmerk = $garage->setMerk($_POST["id"]);
  26. }
  27.  
  28. // Database verbinding verbreken
  29. $disconnect = $garage->disconnectDb();


Graag zou ik op en aanmerkingen krijgen over de manier hoe ik mijn class gebruik maar mag ook op en aanmerkingen of tips geven over andere dingen
Offline WouterJ - 31/10/2012 18:50
Avatar van WouterJ HTML gevorderde Zoiets uitgebreids kan nooit in 1 klasse komen. 1 van de belangrijkste regels in OO is deze:

Citaat:
Elke klasse en method heeft maar 1 verantwoordelijkheid, zodra dit niet het geval is moet de klasse/method worden opgesplitst


Met andere woorden: Als je in de beschrijving van een method of klasse het woordje en gebruikt ben je verkeerd bezig.

Als ik je Garage klasse zo bekijk bevat hij heel veel verantwoordelijkheden:
- Verbinding maken met de database
- Het handelen met een database en een object
- Het vasthouden van object data
- Het is een auto, fiets en bromfiets in 1
- Het handelt errors af
- ect.

Elk van deze verantwoordelijkheden krijgt een eigen klasse. Zoals een Database klasse, een DataMapper om tussen het object en de database te kunnen werken, een Car klasse om de data vast te houden, een onderdeel klasse die vervolgens wordt geextend door vele onderdelen voor een auto, een ErrorHandler klasse, ect.

Het mooie hiervan is dat je straks alles erg flexibel kunt maken. Je hebt straks een DataBase klasse met de methods en dingen die overal gelijk zijn, vervolgens breid je deze uit met een MySQLDataBase klasse om met een MySQL database te werken en met vele andere. Deze klasse geef je mee aan de DataMapper en die weet totaal niet waar en hoe het wordt opgeslagen, wat hij wel weet is dat het wordt opgeslagen en dat hij het kan gebruiken om iets op te slaan.

Dit kun je straks met elke klasse doen.
Offline beronne - 31/10/2012 22:14
Avatar van beronne Lid
WouterJ schreef:
Zoiets uitgebreids kan nooit in 1 klasse komen. 1 van de belangrijkste regels in OO is deze:

[..quote..]

Met andere woorden: Als je in de beschrijving van een method of klasse het woordje en gebruikt ben je verkeerd bezig.

Als ik je Garage klasse zo bekijk bevat hij heel veel verantwoordelijkheden:
- Verbinding maken met de database
- Het handelen met een database en een object
- Het vasthouden van object data
- Het is een auto, fiets en bromfiets in 1
- Het handelt errors af
- ect.

Elk van deze verantwoordelijkheden krijgt een eigen klasse. Zoals een Database klasse, een DataMapper om tussen het object en de database te kunnen werken, een Car klasse om de data vast te houden, een onderdeel klasse die vervolgens wordt geextend door vele onderdelen voor een auto, een ErrorHandler klasse, ect.

Het mooie hiervan is dat je straks alles erg flexibel kunt maken. Je hebt straks een DataBase klasse met de methods en dingen die overal gelijk zijn, vervolgens breid je deze uit met een MySQLDataBase klasse om met een MySQL database te werken en met vele andere. Deze klasse geef je mee aan de DataMapper en die weet totaal niet waar en hoe het wordt opgeslagen, wat hij wel weet is dat het wordt opgeslagen en dat hij het kan gebruiken om iets op te slaan.

Dit kun je straks met elke klasse doen.


Bedankt voor de informatie. Ik neem dit zeker mee naar een volgende oefenopdracht.
Alleen snap ik datamapper niet zo goed, wat doet deze ik denk iets met data maar hoe of wat.


Dus ik zou eigenlijk de garage op de volgende manier moeten bouwen:
- database_class.php
Hier wordt verbinding gemaakt met de database
en beëindigd. (Moet ik hier ook de querys bv SELECT, UPDATES maken)

- datamapper_class.php
Weet nog niet echt wat dit doet???

- auto_class.php
Hier doe ik een extend van de dbClass om de data voor auto's op te slaan
Dit doe ik ook voor class_fiets.php en de andere categorien.

- onderdeel_class.php
hier haal ik de data op voor de onderdelen doormiddel van de db class (extend)

- error_class.php
om de errors af te handelen maar zou dan niet zo weten hoe ik dit moet gebruiken.
Gewoon errors definiëren en door middel van extends gebruiken in andere classes????

Ik hoop dat ik zo een beetje op de juiste denk wijze zit, ik wil het graag goed leren
maar al vast bedankt voor de nuttige info

Offline WouterJ - 31/10/2012 23:24 (laatste wijziging 31/10/2012 23:25)
Avatar van WouterJ HTML gevorderde Oh, extend heb je nog niet echt goed door. Extend betekend een IS_EEN relatie. Een Admin extend bijv. de User, je kan zeggen "Een admin IS_EEN user". Je kan niet zeggen "Een auto IS_EEN database". Lees eens mijn serie, misschien begrijp je het dan beter: wouterj.nl/serie/orienteer-je-in-objecten/

De Database klasse handelt alles voor de database. Hij is het zogenaamde database abstraction layer. Op een ander forum heb ik ooit een voorbeeld uitgetypt: http://www.phph...26/#602127

Wat een datamapper is heb ik ooit ook eens behoorlijk uitgebreid uitgelegd: http://www.phph.../1/#606620

Je maakt een Onderdeel klasse die de superklasse is. Deze wordt geextend door bijv. een StuurKlasse en een DeurKlasse. Eventueel kun je er nog een laag tussenbouwen waardoor je zoiets krijgt:
  1. . PartInterface
  2. ^
  3. |
  4. CarPart <------
  5. ^ \
  6. / \
  7. ... -> InteriorPart OutsidePart
  8. ^ ^ ^
  9. / \ |
  10. DashboardPart ChairPart ...
  11. ^ ^
  12. / \
  13. SteerPart ...


Een voorbeeld van een error klasse kun je hier vinden: http://www.phph...77/#623341

PS: Voel je niet beledigd omdat ik bijna niks typ en je de hele tijd naar andere reacties link, OO uitleggen kost veel tijd en als ik het eenmaal goed heb uitgelegd vind ik het beter om er naar te linken.
Offline marten - 02/11/2012 08:56
Avatar van marten Beheerder Zoals eerder gezegd, kijk eens naar overerving in classes.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.345s