Object Oriented Programming - PFZ.nl
Object Oriented Programming - PFZ.nl
Object Oriented Programming - PFZ.nl
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Object</strong> <strong>Oriented</strong> <strong>Programming</strong><br />
voor webapplicaties<br />
Door Edwin Vlieg
• Waarom OOP?<br />
• Basis uitleg over OOP<br />
• Design Patterns<br />
• ActiveRecord<br />
• Model View Controller<br />
• Extra informatie<br />
• Vragen
OOP<br />
• <strong>Object</strong> <strong>Oriented</strong> <strong>Programming</strong><br />
• Alle code in classes<br />
• Classes hebben verantwoordelijkheden<br />
• Verantwoordelijkheden staan in het contract<br />
• Classes kunnen een Design Pattern vormen<br />
• PHP5 heeft een goede ondersteuning voor OOP
• Structuur in je code<br />
• Herbruikbaarheid<br />
• Leesbaarheid<br />
• Sneller kunnen ontwikkelen<br />
• Design patterns<br />
• Communicatie met collega’s<br />
Waarom OOP?
Ja, want:<br />
Maar ook in webapplicaties??<br />
• die hebben ook recht op structuur,<br />
• PHP laat je altijd alles opnieuw doen,<br />
• er zijn goede design patterns voor.<br />
Waarschuwing:<br />
• OOP != procedurele code in classes gooien<br />
• OOP == een denkwijze
1. Waarom OOP?<br />
2. Basis uitleg over OOP<br />
3. Design Patterns<br />
4. ActiveRecord<br />
5. Model View Controller<br />
6. Extra informatie<br />
7. Vragen
Classes<br />
Class is een definitie van functionaliteit door middel van:<br />
• Eigenschappen: $bLustBier<br />
• Queries: getNaam()<br />
• Commando’s: setSchoenMaat($iSize)<br />
Eigenschappen zijn de ‘oude’ variabelen. Queries en commando’s zijn de<br />
‘oude’ functies, in OOP context vaak methoden genoemd.
public function __construct($sNaam){<br />
parent::__construct($sNaam);<br />
$this->bLustBier = true;<br />
}<br />
public function setSchoenMaat($iSize){<br />
if($iSize < 45){<br />
throw new Exception("Dit kan geen PHPFreak zijn!");<br />
}<br />
$this->iSchoenMaat = $iSize;<br />
}
Overerving<br />
• Door middel van overerving kan je in een overervende class gebruik<br />
maken van de functionaliteit van de basis class.<br />
• In veel gevallen een generalisatie van een class:<br />
Persoon > PHPFreak<br />
Controller > HomeController<br />
• Je specificeert extra eigenschappen en functionaliteit die alleen voor die<br />
generalisatie gelden (en dus niet voor de basis klasse)
public function __construct($sNaam){<br />
parent::__construct($sNaam);<br />
$this->bLustBier = true;<br />
}<br />
// ...<br />
public function setSchoenMaat($iSize){<br />
// ...<br />
$this->iSchoenMaat = $iSize;<br />
}
Design by Contract<br />
• Classen geven een contract: “als jij mij zo gebruikt, dan zal ik dit voor je<br />
regelen”<br />
• Via de commentaar-regels kan je zien wat het contract van een class of<br />
methode is.<br />
• Een class kan exceptions gooien als jij je niet aan het contract houdt.<br />
• Eigenschappen vaak private om contract te kunnen uitvoeren.
private $iSchoenMaat;<br />
// ...<br />
/**<br />
* @desc Verander de schoenmaat<br />
* @param $iSize integer<br />
*/<br />
public function setSchoenMaat($iSize){<br />
if(!is_numeric($iSize)){<br />
throw new Exception("Dit is geen getal");<br />
}<br />
if($iSize < 45){<br />
throw new Exception("Dit kan geen PHPFreak zijn!");<br />
}<br />
$this->iSchoenMaat = $iSize;<br />
}
<strong>Object</strong>en<br />
• <strong>Object</strong>en zijn instanties van een class,<br />
• Op een object kan je de bewerkingen uitvoeren die een class biedt,<br />
• Aan een object kan je eigenschappen vragen.
Voorbeeld
Class methods<br />
class Person {<br />
public static function find($sName){<br />
return new Person($sName);<br />
}<br />
}<br />
$oPerson = Person::find(“Pietje”);<br />
• Als je op een object een methode aanroept, roep je een instantie methode<br />
aan: $oPerson->setName(“Pietje”);<br />
• Je kunt ook statische methoden aanroepen: Person::find(“Klaas”);<br />
• Een statische methode voert iets op class niveau uit en heeft dus geen<br />
toegang tot eigenschappen van een object.
1. Waarom OOP?<br />
2. Basis uitleg over OOP<br />
3. Design Patterns<br />
4. ActiveRecord<br />
5. Model View Controller<br />
6. Extra informatie<br />
7. Vragen
Een verzameling van klassen,<br />
Design Patterns<br />
• met een bepaalde onderlinge structuur,<br />
• die een oplossing bieden voor veel voorkomende software problemen.<br />
Voorbeelden:<br />
• Singleton<br />
• ActiveRecord<br />
• Model, View en Controller (MVC)
1. Waarom OOP?<br />
2. Basis uitleg over OOP<br />
3. Design Patterns<br />
4. ActiveRecord<br />
5. Model View Controller<br />
6. Extra informatie<br />
7. Vragen
ActiveRecord<br />
ActiveRecord vormt een laag op een database en versimpelt het<br />
gebruik van een database. SQL queries zijn bijvoorbeeld nauwelijks nog<br />
nodig.<br />
Voorbeeld contract van class ActiveRecord:<br />
• find($iID) geeft de rij met het gegeven id terug<br />
• findAll($aConditions = null, $iLimit = null, $iOffset = null) geeft 1 of<br />
meer rijen terug die voldoen aan de gegeven condities.
Voorbeeld
ActiveRecord<br />
• ActiveRecord is te vinden in het CakePHP framework<br />
• Een variant op het ActiveRecord pattern is ook te vinden in het Zend<br />
Framework
1. Waarom OOP?<br />
2. Basis uitleg over OOP<br />
3. Design Patterns<br />
4. ActiveRecord<br />
5. Model View Controller<br />
6. Extra informatie<br />
7. Vragen
MVC<br />
Het model, view en controller pattern is zeer goed toepasbaar binnen<br />
webapplicaties. Je maakt in je code een splitsing tussen:<br />
• Model: je database; bijvoorbeeld een ActiveRecord pattern<br />
• View: je templates; bijvoorbeeld Smarty<br />
• Controller: het afhandelen van verzoeken van een client en het<br />
samenvoegen van het model en de view.
Zonder OOP<br />
Sommige zaken doe je dubbel als je meer acties krijgt:<br />
• Vertalen van een URL naar een aantal handelingen in PHP<br />
• Foutafhandeling bij missende parameters<br />
• Foutafhandeling bij SQL queries<br />
• SQL queries<br />
Sommige zaken zijn onoverzichtelijk:<br />
• HTML tussen je PHP code<br />
• Scheiding tussen de verschillende acties
Voorbeeld zonder OOP<br />
<br />
$rResult = mysql_query("SELECT *<br />
FROM users<br />
WHERE id = ".intval($_GET['id']));<br />
if(!$rResult){<br />
exit("Er ging iets fout: ".mysql_error());<br />
}<br />
$oUser = mysql_fetch_assoc($rResult);<br />
echo "".$oUser['name']."";<br />
echo "".$oUser['email']."";
User.php<br />
<br />
Voorbeeld met OOP<br />
// UserController.php<br />
<br />
public function indexAction(){<br />
$oUser = User::find($this->params['id']);<br />
$this->user = $oUser;<br />
}<br />
// index.phtml<br />
<br />
Model<br />
De verantwoordelijkheden van het model zijn:<br />
• Een abstractie bieden van de database<br />
• Automatische controle op parameters<br />
• SQL injection tegengaan<br />
View<br />
De verantwoordelijkheden van de view zijn:<br />
• HTML weergave mogelijk maken<br />
• Variabelen beschikbaar maken die toegekend zijn in de controller
Controller<br />
De verantwoordelijkheden van de controller zijn:<br />
• De URL omschrijven naar een aanroep van een bepaalde methode<br />
• Parameters controleren en beschikbaar maken in een instantie variabele<br />
• Variabelen declareren voor de view<br />
De opbouw van een URL is bijvoorbeeld: /user/show/5 De basis class<br />
ApplicationController zal dit omschrijven naar een aanroep van de<br />
methode showAction in de class UserController.
Applicatie structuur<br />
• De mappen structuur van een MVC applicatie zal er bijvoorbeeld zo uit zien:
1. Waarom OOP?<br />
2. Basis uitleg over OOP<br />
3. Design Patterns<br />
4. ActiveRecord<br />
5. Model View Controller<br />
6. Extra informatie<br />
7. Vragen
Frameworks<br />
De volgende frameworks zijn volledig OOP gebaseerd en kunnen je helpen<br />
bij je eerste stappen in OOP land:<br />
• Zend Framework (helaas nog steeds alpha status)<br />
• CakePHP<br />
• Symfony<br />
• CodeIgniter
Losse classes<br />
Op internet zwerven veel losse classes die je onderdeel van je code kan<br />
maken, enkele bekende:<br />
• PHPMailer: e-mail versturen via PHP<br />
• FormHandler: snel formulieren genereren en afhandelen<br />
• FPDF: PDF documenten genereren<br />
• Smarty: template engine<br />
Op phpclasses.org zijn veel classes te vinden
Conclusie
<strong>Object</strong> <strong>Oriented</strong> Code is like sex.<br />
More people talk about it than are actually doing it.<br />
The few who are doing it are: doing it poorly (sure it will<br />
be better next time) and not practicing it safely.
1. Waarom OOP?<br />
2. Basis uitleg over OOP<br />
3. Design Patterns<br />
4. ActiveRecord<br />
5. Model View Controller<br />
6. Extra informatie<br />
7. Vragen