17.09.2013 Views

Object Oriented Programming - PFZ.nl

Object Oriented Programming - PFZ.nl

Object Oriented Programming - PFZ.nl

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!