OOP PHP - Eerste test, tips graag!
dit is mijn eerste testje om OOP te gaan gebruiken in PHP,
ik vroeg me af of dit zowat goed in elkaar zit en vooral wat ik fout doe, wat beter kan etc...
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 unitscreate {
private $wood;
private $clay;
private $iron;
private $cost;
private $name;
private $description
function setCost($wood, $clay, $iron) {
$this->cost = array("wood" => $wood, "clay" => $clay, "iron" => $iron);
}
function setName($name) {
$this->name = $name;
}
function setDescription($description) {
$this->description = $description;
}
function getCost() {
return $this->cost;
}
function getName() {
return $this->name;
}
function getDescription() {
return $this->description;
}
}
?>
class unitscreate {
private $wood;
private $clay;
private $iron;
private $cost;
private $name;
private $description
function setCost($wood, $clay, $iron) {
$this->cost = array("wood" => $wood, "clay" => $clay, "iron" => $iron);
}
function setName($name) {
$this->name = $name;
}
function setDescription($description) {
$this->description = $description;
}
function getCost() {
return $this->cost;
}
function getName() {
return $this->name;
}
function getDescription() {
return $this->description;
}
}
?>
Ik zou persoonlijk je classname laten beginnen met een hoofdletter, en als naam Units lijkt mij duidelijker, en een betere omschrijving.
hmm jah maar dit is nog maar iets wat ik even in elkaar heb gestoken dus nog niets concreets...
Daarnaast moet er een class komen die alle Unit objecten maakt (door bijvoorbeeld de data uit de db te halen en in objecten te stoppen) de UnitHandler oid.
Die classe bevat dan eveneens functies om objecten van bepaalde unit terug te geven (bijvoorbeeld met een bepaalde kosten, id, beschrijving, oid)
Vb:
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
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
class Unit
{
protected $cost = array();
protected $name;
protected $description
function setCost($wood, $clay, $iron) {
$this->cost = array("wood" => $wood, "clay" => $clay, "iron" => $iron);
}
function setName($name) {
$this->name = $name;
}
function setDescription($description) {
$this->description = $description;
}
function getCost() {
return $this->cost;
}
function getName() {
return $this->name;
}
function getDescription() {
return $this->description;
}
}
{
protected $cost = array();
protected $name;
protected $description
function setCost($wood, $clay, $iron) {
$this->cost = array("wood" => $wood, "clay" => $clay, "iron" => $iron);
}
function setName($name) {
$this->name = $name;
}
function setDescription($description) {
$this->description = $description;
}
function getCost() {
return $this->cost;
}
function getName() {
return $this->name;
}
function getDescription() {
return $this->description;
}
}
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
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
class UnitHandler
{
protected $aUnits = array();
public function __construct() //stop alles in een array
{
$unit = new Unit;
$unit->setCost(2,4,6);
$this->aUnits[] = $unit; //dit is een hardcoded voorbeeld, mooier is natuurlijk uit de db of iets dergelijks
}
public function GetUnitByDescription($sDescription)
{
foreach($this->aUnits as $oUnit)
{
if($oUnit->getDescription() == $sDescription)
{
return $oUnit;
}
}
return false;
// of:
//throw new RuntimeException('UnitHandler::GetUnitByDescription - No data found');
}
}
{
protected $aUnits = array();
public function __construct() //stop alles in een array
{
$unit = new Unit;
$unit->setCost(2,4,6);
$this->aUnits[] = $unit; //dit is een hardcoded voorbeeld, mooier is natuurlijk uit de db of iets dergelijks
}
public function GetUnitByDescription($sDescription)
{
foreach($this->aUnits as $oUnit)
{
if($oUnit->getDescription() == $sDescription)
{
return $oUnit;
}
}
return false;
// of:
//throw new RuntimeException('UnitHandler::GetUnitByDescription - No data found');
}
}
Het allermooiste is om een UnitStorager en een UnitManager te gebruiken:
De UnitStorager kan Unit saven (in een db, textfile, etc.) en units ophalen. De UnitManager heeft functies als GetUnitById(). (De manager krijgt dus alle data van UnitStorager en zet die in objecten, bewaard en beheert die objecten. En geeft die objecten terug als daarom gevraagd wordt).
Het mooie van die scheiding is dat je meer abstractie maakt. Verander je van opslagmedium dan hoef je maar 1 class aan te passen. Namelijk de Storager, de Manager ondervind daar totaal geen problemen van, zolang hij maar de (goede) data krijgt.
Je kan je afvragen of je die scheiding maakt, de kans dat je voor altijd een database blijft gebruiken is vrij groot in de webdevelopmentsector..
OO is het echter correcter dit wel te scheiden.
Dit typende vraag ik mij het volgende af:
Laat je de UnitStorager de data in objecten zetten en geef je die objecten door aan de Manager, of geef je alleen de data door aan de Manager. In mijn ogen alleen de data. Want mocht er een verandering in het object Unit komen, dan hoef je alleen de Manager aan te passen. Zijn hier suggesties/tips/hints/opmerkingen over/voor?
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
// of:
//throw new RuntimeExeption('UnitHandler::GetUnitByDescription - No data found');
Blanche, heel erg bedankt voor de uitleg. ik snap het bovenstaande nog niet.
Ik ga meteen aan de slag met je uitleg en probeer er het beste van te maken, daarna zal ik weer mijn code hier posten voor commentaren.
Ik werk inderdaad met een db ;)
oké...even nog een vraagje, als ik werk met UnitStorager en UnitManager classes, is het dan aan te raden om hetvolgende te doen:
Code (php)
Gewijzigd op 01/01/1970 01:00:00 door Tikkes C
Je eerste vraag:
Dat throw new RuntimeException('UnitHandler::GetUnitByDescription - No data found'); wordt gebruikt als je met Exception werkt.
Hier moet je maar even op googelen of een ander topic over aanmaken.
Over je andere vraag:
Nee,
Bij extenden moet je jezelf alstijd de vraag stellen: is a een b? In dit geval, is UnitManager een UnitStorager? Nee dat is niet hetzelfde.
Een voorbeeld waar je wél moet extenden is hier:
Auto extends Voertuig. Een auto is tenslotte een Voertuig
of BetaaldeGebruiker extends Gebruiker. Een betaalde gebruiker is tenslotte een gebruiker.
OOP videos (3 delen) Leuk/handig om eens te bekijken.
Verder meot je jezelf altijd afvragen of 1 object maar 1 verantwoordeljikheid heeft, en dat een object ook daadwerkelijk 1 ding representateerd.
Vb:
Toen ik net oop probeerde te leren. Had ik een class bericht:
Met functies als NieuwBericht, UpdateBericht, GetBerichten, etc.
Maar een bericht kan natuurlijk nooit meerdere berichten teruggeven...
Mooie video Citroen, erg duidelijk.
Nu al alles bekeken ;)
bedankt voor je uitleg en het filmpje, nu kan ik wel weer verder denk ik :D
eerst en vooral ga ik nu kijken naar het filmpje...
oké...ik blijf wel met een vraagje zitten, waarom heb je bij mijn script 'protected' gezet en niet 'public'?
Gewijzigd op 01/01/1970 01:00:00 door Tikkes C
Code (php)
1
2
3
4
5
2
3
4
5
<?
function setCost($wood, $clay, $iron) {
$this->cost = array("wood" => $wood, "clay" => $clay, "iron" => $iron);
}
?>
function setCost($wood, $clay, $iron) {
$this->cost = array("wood" => $wood, "clay" => $clay, "iron" => $iron);
}
?>
Waarom heb je dan nog een $this->wood, $this->clay en $this->iron zitten?
Ik stel dit voor, zelfde effect maar handiger werken binnen jouw class:
Als je nu de functie getCost() hebt aangeroepen bijv in de variabele $cost, dan heb je de beschikking over
$cost['wood'], $cost['clay'] en $cost['iron']. (eventueel kan je de list functie hier ook voor gebruiken, al is dat met het oog op eventuele grondstof uitbreidingen weer minder handig.