Nu is deze vraag al waarschijnlijk 100 keer gesteld. Maar ik krijg het er bij mij zelf niet in waarom ik OO moet gaan gebruiken.

Ja, ik zie het voordeel van Object oriented programmeren. Maar ik zie niet waarom ik Classes moet gebruiken. Nu heb ik in de tijd dat ik van OO afweet in PHP tot nog toe nooit een echt groot project gehad waarvan ik zeg dat OO echt nodig is.

Nu ben ik echter bezig met een tool, waarbij ik echt volgens mij doen al OO werk, maar niet het voordeel zie van Classes etc...

Als ik dan zoek naar Waarom OO? krijg ik het antwoord "omdat je bepaalde functies kan her gebruiken" Dan kom ik eigenlijk tot de conclusie dat ik al OO denk wanneer ik bijvoorbeeld een centraal bestand heb met daarin functions die ik dus hergebruik.
Ook omdat ik bijvoorbeeld voor een inlog scherm al het bestand inlog.php include. (ik noem maar wat)en die aanpas als er wat moet gebeuren...


Nu ben ik dus niet opzoek waarom OO, maar ik ben eigenlijk opzoek die bij mij de knop kan omzetten om OO te gaan programmeren met de bijbehorende objecten, classes etc.


Ik kom ook nooit uit het voorbeeld van de auto... Boeiend dat deze blauw moet zijn...
Graag hoor ik het ook als ik echt compleet de bus mis en bovenstaande kant noch wal raakt.. Ik probeer bij mij zelf die knop om te zetten....
Een klasse is de blauwdruk van een object. Van een klasse kun je meerdere objecten maken.
Een object moet altijd een enkelvoudig zelfstandig naamwoord zijn. Dus de class naam Mail is beter dan de naam Mails
Verder is het ook weer niet goed als je te algemene klassen maakt. Een gastenboek dat werkt op 1 klasse, is niet juist OO gebruik.
Je hebt hier te maken met heel veel verschillende dingen, die aparte taken hebben.
Bij een gastenboek heb je bijvoorbeeld het formulier, de input checks, de verwerking, de database etc.
Van alleen al een formulier zou je makkelijk 10 klasses kunnen maken.
Een klasse voor elk HTML input element, een klasse voor het formulier algemeen, etc.
Als je dit goed doet, kun je de form klassen ook weel makkelijk hergebruiken om een contact formulier te maken of een ander formulier.
Je hoeft eigenlijk nooit zuinig te zijn met het maken van klassen.
Als je echt goed OO wilt kunnen, zou jet het beste Java kunnen leren (Java is niet Javascript)
Dan wordt je gedwongen om alles OO te doen.
R van der Meer op 27/11/2013 17:41:33

... ik waar dan ook in mijn script kan zeggen dat mijn auto 4 deuren heeft (moet dat dan via $auto-setDeuren; ?)
Maar ook als ik dan naar een andere pagina ga?


Wel, dat is net het probleem dat ik aankaart.

Bij php is elke pagina een afgezonderd verzoek.
Dus, als de gebruiker naar een andere pagina gaat, of op F5 drukt, moet php het object helemaal opnieuw opbouwen.

Bij mijn verhaal van het windows programma zou het wel gelden.
Daar kan die ene variabele (object) minuten lang (zelfs langer) al zijn eigenschappen bewaren, en kan je gelijk wanneer eigenschappen toevoegen.


R van der Meer op 27/11/2013 17:41:33

... ook iets nieuws kan toevoegen wat helemaal niet in het object auto zit? Bijvoorbeeld $auto->setToetsenbord(tekst);?


Hier moet ik ook verwijzen naar de laatste reactie van Harry:
De klasse bepaalt welke eigenschappen en methoden zijn toegelaten. De klasse is een blauwdruk van een object.
Een object is een instance van een klasse.

Dus, als setToetsenbord() niet in de klasse Auto staat, mag het object $auto die functie niet gebruiken.
Harry hogeveen op 27/11/2013 18:29:45

Een object moet altijd een enkelvoudig zelfstandig naamwoord zijn.

"Moet" is een groot woord. Je kunt bijvoorbeeld een class hebben waarin je je paden opslaat. Deze class kun je dan Paths noemen.

Wouter J op 27/11/2013 17:48:18

Het was niet lullig of kort door de bocht bedoelt, R.


Ok, thanks. Het kwam alleen zo over van.. Goh, wat een noob. Normaal gesproken red ik mij prima in de PHP wereld, alleen deze drempel komt er bij mij niet in, waardoor ik toch denk een hoop leuke dingen te missen..

Harry hogeveen op 27/11/2013 18:29:45

Bij een gastenboek heb je bijvoorbeeld het formulier, de input checks, de verwerking, de database etc.
Van alleen al een formulier zou je makkelijk 10 klasses kunnen maken.



Maak ik dan een klasse aan voor bijvoorbeeld het checken van een telefoonnummer (mobiel) die alleen controlleert of een 06 nummer daadwerkelijk ook strat met 06 ( en voor andere landen bijvoorbeeld 049 gebruikt als een bepaalde voorwaarde waar is)?


Harry hogeveen op 27/11/2013 18:29:45

Als je echt goed OO wilt kunnen, zou jet het beste Java kunnen leren (Java is niet Javascript)
Dan wordt je gedwongen om alles OO te doen.


Een collega van mij kaartte dit al aan inderdaad. Die heeft vroeger veel Java gebruikt en kan alleen de link met PHP niet uitleggen, vandaar dat ik vandaag op zoek ging naar "het" antwoord.


Ozzie PHP op 27/11/2013 20:20:05

[quote="Harry hogeveen op 27/11/2013 18:29:45"]
Een object moet altijd een enkelvoudig zelfstandig naamwoord zijn.

"Moet" is een groot woord. Je kunt bijvoorbeeld een class hebben waarin je je paden opslaat. Deze class kun je dan Paths noemen.
[/quote]

Maar als ik het goed begrijp klopt de uitleg van Harry juist wel. De class Path is in zekere zin wel juist, alleen is het zo dat deze meerdere "wegen" kan bevatten.

Want je zegt ook niet "cars" omdat de auto's meerdere kleuren kunnen hebben. De input is variabel, maar het gene wat er mee gebeurt is het zelfde.

ALS ik het goed begrijp..

*verder gaat lezen*


Allemaal wel erg veel bedankt! Denk dat ik er meer van opsteek als ik gewoon (domme) vragen kan stellen.
"Maar als ik het goed begrijp klopt de uitleg van Harry juist wel. De class Path is in zekere zin wel juist, alleen is het zo dat deze meerdere "wegen" kan bevatten.

Want je zegt ook niet "cars" omdat de auto's meerdere kleuren kunnen hebben. De input is variabel, maar het gene wat er mee gebeurt is het zelfde."

Nee, een "Car" object bevat daadwerkelijk slechts 1 auto. Een Paths class bevat meer dan 1 pad. Je zou het ook een PathCollection kunnen noemen, maar persoonlijk vind ik dat nogal lang.
OK, maar waarom zou ik de paths in een class willen stoppen als ik ze ook in een array kan lezen vanuit de database?


$pathto['imgages'];

waarbij images => 'path/naar/de/afbeelding/vanaf/relatief/ofzo/' in de array geplaatst wordt door een while loop op een db query.

Ik zou ten eerste paths niet in een database zetten. Als je ze in een object hebt zitten, en dat object in een services container stopt, dan kun je straks overal in je applicatie dit soort dingen doen.

$this->services->get('paths')->get('image');
Wat ik tot op heden deed is dat ik gewoon een aantal woorden of teksten in de database stop ( die teksten moeten variabel aan te passen zijn door de eind gebruiker ) en die loop ik dan door.
Dat kan, maar dat heeft verder niks met OOP te maken.

Maak ik dan een klasse aan voor bijvoorbeeld het checken van een telefoonnummer (mobiel) die alleen controlleert of een 06 nummer daadwerkelijk ook strat met 06 ( en voor andere landen bijvoorbeeld 049 gebruikt als een bepaalde voorwaarde waar is)?


Even een voorbeeldje.

<?php

class phoneNumber {

private $number;

public function __construct($number) {

$this->number = $number;

}

public function validate() {

// kijk of de gegeven waarde geen float(10.5) is en wel een integer (1234)
if(is_numeric($this->number) && !(strpos($this->number, "."))) {
$this->number = intval($this->number);
}

if(!is_int($this->number)) {
throw new InvalidArgumentException('Gebruiker heeft geen integer ingevoerd: ' . $this->number);
return false;
}
// check of dit nummer uit 10 cijfers bestaat. > 9 omdat 0 niet meegeteld wordt ( ik ben geen regex expert)
elseif(!(preg_match('/^\d{9}$/', $this->number))) {
throw new LengthException('Nummer voldoet niet aan de nederlandse notatie: ' . $this->number);
return false;
}
else {
return true;
}

}

}

$number = new phoneNumber(0613266263);
echo $number->validate();

?>

In het voorbeeldje hierboven zie je dat dit werkt voor de nederlandse manier. maar wat als je nu een systeem nodig hebt die kan checken voor zowel een Nederlandse, Buitenlandse 1, Buitenlandse 2, Buitenlandse 3.. tsja dan stel je natuurlijk een contract op waarbij je klasses dwingt om op een bepaalde manier nummers te gaan controleren Hoe die klasses dat doen? dat mogen ze zelf weten. als ze maar wel de benodigde methoden implementeren. Wat je nu kan doen hiervoor is een interface gebruiken ( alleen methoden declareren ) of een abstracte klasse maken waarbij je de validate methode als abstract declareert en deze door de klassen die deze abstracte methode overerven het validate gedeelte doen.

Hier geef ik je de tip om wanneer mogelijk een interface te gebruiken omdat je waar mogelijk moet programmeren naar een interface en niet naar een implementatie toe.

Wat onze code nu dus kan worden is

<?php
interface phoneNumber {
public function validate();
}

class dutchPhoneNumber implements phoneNumber{

private $number;

public function __construct($number) {

$this->number = $number;

}

public function validate() {

// kijk of de gegeven waarde geen float(10.5) is en wel een integer (1234)
if(is_numeric($this->number) && !(strpos($this->number, "."))) {
$this->number = intval($this->number);
}

if(!is_int($this->number)) {
throw new InvalidArgumentException('Gebruiker heeft geen integer ingevoerd: ' . $this->number);
return false;
}
// check of dit nummer uit 10 cijfers bestaat. ( regex niet getest )
elseif(!(preg_match('/^\d{10}$/', $this->number))) {
throw new LengthException('Nummer voldoet niet aan de nederlandse notatie: ' . $this->number);
return false;
}
else {
return true;
}

}

}

class germanPhoneNumber implements phoneNumber{

private $number;

public function __construct($number) {

$this->number = $number;

}

public function validate() {

// kijk of de gegeven waarde geen float(10.5) is en wel een integer (1234)
if(is_numeric($this->number) && !(strpos($this->number, "."))) {
$this->number = intval($this->number);
}

if(!is_int($this->number)) {
throw new InvalidArgumentException('Gebruiker heeft geen integer ingevoerd: ' . $this->number);
return false;
}
// hier kijken we of er 11 cijfers voorkomen. ( regex niet getest )
elseif(!(preg_match('/^\d{11}$/', $this->number))) {
throw new LengthException('Nummer voldoet niet aan de duitse notatie: ' . $this->number);
return false;
}
else {
return true;
}

}

}

$number = new dutchPhoneNumber(06123456789);
echo $number->validate();

$number = new germanPhoneNumber(06123456789);
echo $number->validate();

?>

Reageren