OOP start
Ik heb nu het volgende:
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
38
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
38
<?php
class User
{
private $_username;
private $_firstname;
private $_middlename;
private $_lastname;
private $_language;
public function __construct($name = 'Bezoeker')
{
$this->_username = $name;
}
protected function setUsername($name)
{
$this->_username = $name;
}
public function getUsername()
{
return (isset($this->_username)) ? $this->_username : false;
}
protected function setLanguage($language)
{
$this->_language = $language;
}
public function getLanguage()
{
return (isset($this->_language)) ? $this->_language : false;
}
}
?>
class User
{
private $_username;
private $_firstname;
private $_middlename;
private $_lastname;
private $_language;
public function __construct($name = 'Bezoeker')
{
$this->_username = $name;
}
protected function setUsername($name)
{
$this->_username = $name;
}
public function getUsername()
{
return (isset($this->_username)) ? $this->_username : false;
}
protected function setLanguage($language)
{
$this->_language = $language;
}
public function getLanguage()
{
return (isset($this->_language)) ? $this->_language : false;
}
}
?>
En wil dit graag gebruiken als basis (dit is nog niet uitgewerkt). Mijn vraag is echter waar ik de login functies maak? Maak ik hiervoor een aparte Login class of doe ik dat in deze class zodat de volgende class die ik wil maken 'employe' gebruik kan maken van de functionaliteit van de 'user' (parent) class?
Het mooie aan de tutorials die ik zie is dat alles goed wordt uitgelegd, maar niet meerdere voorbeelden worden gegeven over andere functies die een class kan hebben.
De volgende tutorials heb ik doorgenomen:
http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-1.php
http://www.phphulp.nl/php/tutorial/overig/oop-beginnershandleiding-php5/701/inleiding/1841/
http://phptuts.nl/view/45/1/
http://www.phphulp.nl/php/tutorial/classes/dependency-injection/760/inleiding/2027/
Als er nog meer aanraders zijn wil ik ze graag doorlezen!
Gewijzigd op 09/10/2012 17:45:33 door Mebus Hackintosh
return (isset($this->_language)) ? $this->_language : false;
edit;
nu antwoord op je vraag, je hebt nu slechts een 'domain' class gemaakt. Nu moet je nog je models + controllers maken;
controller is de koppeling tussen je domain class en je model (model spreekt db class weer aan).
edit;
als je employee/customer etc wilt gaan gebruiken die erven van user moet je hem abstract maken (volgens mij kan dat in php) en dan doe je Employee extends User en kan je eventueel de parent/super aanroepen
Gewijzigd op 09/10/2012 18:53:35 door Jaron T
Jaron T op 09/10/2012 18:49:42:
Ipv elke keer deze onzin uit te voeren kan je beter je properties een default value geven;
return (isset($this->_language)) ? $this->_language : false;
edit;
nu antwoord op je vraag, je hebt nu slechts een 'domain' class gemaakt. Nu moet je nog je models + controllers maken;
controller is de koppeling tussen je domain class en je model (model spreekt db class weer aan).
return (isset($this->_language)) ? $this->_language : false;
edit;
nu antwoord op je vraag, je hebt nu slechts een 'domain' class gemaakt. Nu moet je nog je models + controllers maken;
controller is de koppeling tussen je domain class en je model (model spreekt db class weer aan).
Zal dat stukje code veranderen, dankje.
Ik zal even googlen voor models en controllers!
http://wouterj.nl/serie/orienteer-je-in-objecten/
Even antwoord op je vraag:
In OO heb je vele regeltjes, maar de grootste/belangrijkste is deze:
Elke klasse of method heeft maar 1 verantwoordelijkheid.
In andere woorden:
Zodra je het woordje 'en' oid gebruikt in een omschrijving van een klasse of method weet je zeker dat je het moet splitten in meerdere klassen of methoden.
Ik denk dat je jezelf nu wel kunt antwoorden.
OO gaat niet zozeer om de code, meer om het denken. Vandaar dat ik een echte OO denk tutorial heb geschreven, misschien handig om eens te lezen: Even antwoord op je vraag:
In OO heb je vele regeltjes, maar de grootste/belangrijkste is deze:
Elke klasse of method heeft maar 1 verantwoordelijkheid.
In andere woorden:
Zodra je het woordje 'en' oid gebruikt in een omschrijving van een klasse of method weet je zeker dat je het moet splitten in meerdere klassen of methoden.
Ik denk dat je jezelf nu wel kunt antwoorden.
Wouter J op 09/10/2012 18:53:07:
OO gaat niet zozeer om de code, meer om het denken. Vandaar dat ik een echte OO denk tutorial heb geschreven, misschien handig om eens te lezen: http://wouterj.nl/serie/orienteer-je-in-objecten/
Even antwoord op je vraag:
In OO heb je vele regeltjes, maar de grootste/belangrijkste is deze:
Elke klasse of method heeft maar 1 verantwoordelijkheid.
In andere woorden:
Zodra je het woordje 'en' oid gebruikt in een omschrijving van een klasse of method weet je zeker dat je het moet splitten in meerdere klassen of methoden.
Ik denk dat je jezelf nu wel kunt antwoorden.
Even antwoord op je vraag:
In OO heb je vele regeltjes, maar de grootste/belangrijkste is deze:
Elke klasse of method heeft maar 1 verantwoordelijkheid.
In andere woorden:
Zodra je het woordje 'en' oid gebruikt in een omschrijving van een klasse of method weet je zeker dat je het moet splitten in meerdere klassen of methoden.
Ik denk dat je jezelf nu wel kunt antwoorden.
Super! Dit is net wat ik nodig had.
Scheelt een hoop getjes en setjes...
Code (php)
Dan wil je controleren of je wel een geldig email adres hebt:
Code (php)
En nu wil je opeens dat de username alleen uit letters bestaat:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class User
{
// ...
public function __set($key, $value)
{
// ...
} elseif ('name' == $key) {
if (!preg_match('|^[A-Za-z ]*?$|', $key)) {
throw new \InvalidArgumentException(sprintf('Een gebruikersnaam mag alleen letters of spaties bevatten, "%s" is gegeven', $value));
}
}
$this->$key = $value;
}
}
?>
class User
{
// ...
public function __set($key, $value)
{
// ...
} elseif ('name' == $key) {
if (!preg_match('|^[A-Za-z ]*?$|', $key)) {
throw new \InvalidArgumentException(sprintf('Een gebruikersnaam mag alleen letters of spaties bevatten, "%s" is gegeven', $value));
}
}
$this->$key = $value;
}
}
?>
Nou dan weet ik wel wat sneller is en beter is, het gebruik van verschillende setters. Want nu heeft de method al weer 2 verantwoordelijkheden gekregen en het zal waarschijnlijk nog langzamer zijn ook, want magic methods zijn altijd al langzamer + de extra onnodige if statements.
persoonlijk zal ik je aanraden om wel gebruik te maken van __construct maar niet van de __set en __get , maar voor de non-magic methode zoals hij in (alle?) andere (echte)OOP talen gebruikt wordt. Dus gewoon getName(){} setName(){} etc.
Een get en set zijn enkel voor het 1 op 1 doorzetten van data.
De logica welke van toepassing is op een property zou je kunnen inzetten doormiddel van idd een soort Set methode. Maar als je van de 8 properties er 1 wil controleren of er een e-mailadres in zit, kun je dat beter voor die ene een set methode maken en de rest via magic methodes uit laten voeren.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$user = new User();
$user->name = 'wouter'; // alsof je een property zet
$user->setEmail('[email protected]'); // met een functie
?>
$user = new User();
$user->name = 'wouter'; // alsof je een property zet
$user->setEmail('[email protected]'); // met een functie
?>
En waarom doen we dat nou eigenlijk? Voor die 1 minuut meer typewerk?
In PHP5.5 krijgen we waarschijnlijk de set/get methode uit C#, dat zou heel erg handig zijn: http://nikic.github.com/2012/07/10/What-PHP-5-5-might-look-like.html#getters_and_setters
maar tot die tijd moeten we het maar gewoon behelpen met wat meer typewerk.
Merk overigens op dat ik tegen de get en set magic methods ben, er zijn vele hele handige magic methods.
@Wouter J, ik kan niet wachten op meer tutorials van je!
Mebus, het kost mij behoorlijk veel tijd om zo'n tutorial te schrijven, mede doordat ik geen regel code wil gebruiken, en veel tijd heb ik momenteel niet echt. Misschien dat er over 2 weken een nieuwe tutorial komt in die serie.
Wouter J op 10/10/2012 17:44:47:
Mebus, het kost mij behoorlijk veel tijd om zo'n tutorial te schrijven, mede doordat ik geen regel code wil gebruiken, en veel tijd heb ik momenteel niet echt. Misschien dat er over 2 weken een nieuwe tutorial komt in die serie.
Oke, ik kan ook wel even wachten natuurlijk :) Wou alleen zeggen dat je tutorials beter te begrijpen zijn dan vele anderen.