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.
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
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
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.
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.
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.
<?php
// Include class_Garage.php
include_once("classes/class_Garage.php");
// Nieuw object aanmaken Garage
$garage = new Garage();
// Database verbinding maken
$connect = $garage->connect("localhost", "root", "", "garage");
// Include de view voordat de verbinding wordt verbroken
// anders kunnen we geen data vanuit de db er weergeven
include_once("view/showgarage.php");
// Database verbinding verbreken
$disconnect = $garage->disconnectDb();
<?php
/**
* Garage Assemblage class
*
* Het doel van deze class is om een
* een overzicht te generen voor een garage.
* Als de garage een product willen assembleren,
* hebben ze een overzicht nodig met welke onderdelen
* ze moeten gebruiken.
*
* Op dit moment heeft de garage 4 producten:
* Auto, Vrachtauto's Scooters en Snorfietsen
* Een auto kan uit meerdere types bestaan: audie, bmw etc.
*
* Aan deze types zijn weer onderdelen gekoppeld:
* Voorbeeld onderdelen Audie: stuur, audie logo etc.
*/
class Garage{
/*
Properties (variablen)
*/
private $host;
private $username;
private $password;
private $database;
private $con; // Verbdingen db maken en verbreken
/*
Methoden (Functies)
*/
public function connect($set_host, $set_username, $set_password, $set_database){
$this->host = $set_host;
$this->username = $set_username;
$this->password = $set_password;
$this->database = $set_database;
$this->con = mysql_connect($this->host, $this->username, $this->password)or die("Kan geen verbinding maken");
mysql_select_db($this->database) or die("Kan geen DB selecteren");
}
public function setCat(){
$option = "";
$sql = "SELECT id, naam FROM categorie ORDER BY naam ASC";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)){
$option .= "<option value=".$row["id"].">".$row["naam"]."</option>";
}
return $option;
}
public function setMerk($id){
if($id == "none"){
$option = "<option value=\"none\">Kies eerst een categorie</option>";
} else {
$option = "";
$option = "<option value=\"none\">Kies merk</option>";
$sql = "SELECT id, naam FROM merken WHERE cat_id = ".$id." ORDER BY naam ASC";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)){
$option .= "<option value=".$row["id"].">".$row["naam"]."</option>";
}
}
return $option;
}
public function showParts($cat_id, $merk_id){
$sql = "SELECT id, onderdeel, omschrijving, prijs FROM onderdelen WHERE merk_id =".$merk_id." AND cat_id =".$cat_id;
$result = mysql_query($sql);
if($result == false){
// Doe niks
} elseif(mysql_num_rows($result) == 0) {
return "<p>Geen restultaten gevonden</p>";
} else {
// Start tabel
$table = "<table class=tab_onderdeel border=1 cellspacing=0>";
$table .= "<tr>";
// Teller voor number off fields
$count = mysql_num_fields($result);
// Header tabel
for($i = 0; $i < $count; $i++){
$field_name = mysql_field_name($result, $i);
$table .= "<th>".$field_name."</th>";
}
$table .= "</tr>";
$table .= "<tr>";
// Body tabel
$totaal = 0; // Teller voor totaal optellen
while($row = mysql_fetch_object($result)){
$totaal += $row->prijs; // Replace . for ,
for($i = 0; $i < $count; $i++){
$field_name = mysql_field_name($result, $i);
// Check om prijs class appart te stylen
if($field_name == "prijs"){
$table .= "<td class=prijs>€ ".number_format($row->$field_name, 2, ",", "")."</td>";
} else {
$table .= "<td>".$row->$field_name."</td>";
}
}
$table .= "</tr>";
}
$table .= "<tr class=totaal><td>Totaal</td><td></td><td></td><td>€ ".number_format($totaal, 2, ",", "")."</td></tr>";
$table .= "</table>";
return $table;
}
}
public function disconnectDb(){
mysql_close($this->con);
}
}
<?php
/**
* Garage Assemblage class
*
* Het doel van deze class is om een
* een overzicht te generen voor een garage.
* Als de garage een product willen assembleren,
* hebben ze een overzicht nodig met welke onderdelen
* ze moeten gebruiken.
*
* Op dit moment heeft de garage 4 producten:
* Auto, Vrachtauto's Scooters en Snorfietsen
* Een auto kan uit meerdere types bestaan: audie, bmw etc.
*
* Aan deze types zijn weer onderdelen gekoppeld:
* Voorbeeld onderdelen Audie: stuur, audie logo etc.
<?php
/**
* AJAX REQUESTS
*
* Afhandelen van alle Ajax
* requests worden hier opgevangen
* en naar de class gestuurd die stuurt
* weer een return terug naar ajax.php
* waarna Jquery ajax succes function die data
* hiervan ophaald.
*/
// Include class_Garage.php
include_once("classes/class_Garage.php");
// Nieuw object aanmaken Garage methods
// te kunnen gebruiken
$garage = new Garage();
// Database verbinding maken
$connect = $garage->connect("localhost", "root", "", "garage");
// Kijken of id is gezet
if(isset($_POST["id"])){
echo $setmerk = $garage->setMerk($_POST["id"]);
}
// Database verbinding verbreken
$disconnect = $garage->disconnectDb();
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.
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
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
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:
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.