OOP PHP - Eerste test, tips graag!

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior Front-end Developer

If you are enthusiastic about front-end programming, and want to join a rapidly growing company where there is plenty of room for creativity and innovation, this is your chance.    We are currently looking for a talented Senior Front-end Developer to join our Development team in Eindhoven fulltime.  What we offer  A great opportunity to make an impact in a fast-growing logistics start-up.  The possibility to grow within the company. An informal, transparent, international and open culture.  A competitive salary and 25 vacation days per year.  Other perks: travel allowance, a pension plan, a gym membership, team building activities.  Who are you?  You are passionate for programming, you are ambitious and eager to continue developing yourself, and you are not afraid of taking full ownership

Bekijk vacature »

Tikkes C

Tikkes C

12/01/2009 21:21:00
Quote Anchor link
Hoi iedereen,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }
    
}

?>
 
PHP hulp

PHP hulp

17/10/2021 01:11:33
 
Rens nvt

Rens nvt

12/01/2009 21:24:00
Quote Anchor link
Ik zou persoonlijk je classname laten beginnen met een hoofdletter, en als naam Units lijkt mij duidelijker, en een betere omschrijving.
 
Tikkes C

Tikkes C

12/01/2009 21:26:00
Quote Anchor link
hmm jah maar dit is nog maar iets wat ik even in elkaar heb gestoken dus nog niets concreets...
 
Citroen Anoniem Graag

Citroen Anoniem Graag

12/01/2009 21:43:00
Quote Anchor link
De naam Units is incorrect in mijn ogen. 1 object representateert hier tenslotte maar 1 unit. De naam Unit is daarom beter op zijn plaats.

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)
PHP script in nieuw venster Selecteer het PHP script
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
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;
    }
    
}


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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');
    }
}


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
 
Tikkes C

Tikkes C

13/01/2009 08:38:00
Quote Anchor link
return false;
// 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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?PHP

class UnitStorager
{
//hier komen dan de functions
}

class UnitManager extends UnitStorager
{
//hier zit dan mijn manager
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Tikkes C
 
Citroen Anoniem Graag

Citroen Anoniem Graag

13/01/2009 17:46:00
Quote Anchor link
Eigelijk heet ik geen Blanche maar Citroen ;) Maar dat ter zijde:


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...
 
Jurgen assaasas

Jurgen assaasas

13/01/2009 18:04:00
Quote Anchor link
Mooie video Citroen, erg duidelijk.
 
Citroen Anoniem Graag

Citroen Anoniem Graag

13/01/2009 18:06:00
Quote Anchor link
Nu al alles bekeken ;)
 
Tikkes C

Tikkes C

15/01/2009 09:52:00
Quote Anchor link
Sorry voor die naamverwarring ;) geen idee hoe ik daarop kwam...

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
 
Hipska BE

Hipska BE

15/01/2009 11:09:00
Quote Anchor link
ik heb nog een vraagje over dit stuk:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
    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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

    function setCost($wood, $clay, $iron) {
        $this->wood = $wood;
        $this->clay = $clay;
        $this->iron = $iron;
    }
    
    function
getCost(){
        return array("wood" => $this->wood, "clay" => $this->clay, "iron" => $this->iron);
    }

    
?>
 
Robert Deiman

Robert Deiman

15/01/2009 11:23:00
Quote Anchor link
Hipska heeft gelijk, het is dan veel handiger om het op die manier te doen. Voordeel is dat je alleen maar die functie even hoeft aan te passen als je besluit meer grondstoffen toe te voegen.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.