Object Oriented Programming for web applications

35
Object Oriented Programming voor webapplicaties Door Edwin Vlieg

description

Object Oriented Programming voor web applicaties (PHP5)

Transcript of Object Oriented Programming for web applications

Page 1: Object Oriented Programming for web applications

Object Oriented Programmingvoor webapplicaties

Door Edwin Vlieg

Page 2: Object Oriented Programming for web applications

• Waarom OOP?

• Basis uitleg over OOP

• Design Patterns

• ActiveRecord

• Model View Controller

• Extra informatie

• Vragen

Page 3: Object Oriented Programming for web applications

OOP

• Object Oriented Programming

• Alle code in classes

• Classes hebben verantwoordelijkheden

• Verantwoordelijkheden staan in het contract

• Classes kunnen een Design Pattern vormen

• PHP5 heeft een goede ondersteuning voor OOP

Page 4: Object Oriented Programming for web applications

Waarom OOP?

• Structuur in je code

• Herbruikbaarheid

• Leesbaarheid

• Sneller kunnen ontwikkelen

• Design patterns

• Communicatie met collega’s

Page 5: Object Oriented Programming for web applications

Maar ook in webapplicaties??

Ja, want:

• die hebben ook recht op structuur,

• PHP laat je altijd alles opnieuw doen,

• er zijn goede design patterns voor.

Waarschuwing:

• OOP != procedurele code in classes gooien

• OOP == een denkwijze

Page 6: Object Oriented Programming for web applications

1. Waarom OOP?

2. Basis uitleg over OOP

3. Design Patterns

4. ActiveRecord

5. Model View Controller

6. Extra informatie

7. Vragen

Page 7: Object Oriented Programming for web applications

Classes

Class is een definitie van functionaliteit door middel van:

• Eigenschappen: $bLustBier

• Queries: getNaam()

• Commando’s: setSchoenMaat($iSize)

Eigenschappen zijn de ‘oude’ variabelen. Queries en commando’s zijn de ‘oude’ functies, in OOP context vaak methoden genoemd.

Page 8: Object Oriented Programming for web applications

<?phpclass Persoon { private $sNaam; public function __construct($sNaam){ $this->sNaam = $sNaam; } public function getNaam(){ return $this->sNaam; }}

class PHPFreak extends Persoon { private $bLustBier; private $iSchoenMaat; public function __construct($sNaam){ parent::__construct($sNaam); $this->bLustBier = true; } public function setSchoenMaat($iSize){ if($iSize < 45){ throw new Exception("Dit kan geen PHPFreak zijn!"); } $this->iSchoenMaat = $iSize; } }?>

Page 9: Object Oriented Programming for web applications

Overerving

• Door middel van overerving kan je in een overervende class gebruik maken van de functionaliteit van de basis class.

• In veel gevallen een generalisatie van een class: Persoon > PHPFreakController > HomeController

• Je specificeert extra eigenschappen en functionaliteit die alleen voor die generalisatie gelden (en dus niet voor de basis klasse)

Page 10: Object Oriented Programming for web applications

<?phpclass Persoon { private $sNaam; public function __construct($sNaam){ $this->sNaam = $sNaam; } public function getNaam(){ return $this->sNaam; }}

class PHPFreak extends Persoon { private $bLustBier; private $iSchoenMaat; public function __construct($sNaam){ parent::__construct($sNaam); $this->bLustBier = true; } // ... public function setSchoenMaat($iSize){ // ... $this->iSchoenMaat = $iSize; } }?>

Page 11: Object Oriented Programming for web applications

Design by Contract

• Classen geven een contract: “als jij mij zo gebruikt, dan zal ik dit voor je regelen”

• Via de commentaar-regels kan je zien wat het contract van een class of methode is.

• Een class kan exceptions gooien als jij je niet aan het contract houdt.

• Eigenschappen vaak private om contract te kunnen uitvoeren.

Page 12: Object Oriented Programming for web applications

<?php

class PHPFreak extends Persoon {

private $iSchoenMaat; // ...

/** * @desc Verander de schoenmaat * @param $iSize integer */ public function setSchoenMaat($iSize){ if(!is_numeric($iSize)){ throw new Exception("Dit is geen getal"); } if($iSize < 45){ throw new Exception("Dit kan geen PHPFreak zijn!"); } $this->iSchoenMaat = $iSize; } }?>

Page 13: Object Oriented Programming for web applications

Objecten

• Objecten zijn instanties van een class,

• Op een object kan je de bewerkingen uitvoeren die een class biedt,

• Aan een object kan je eigenschappen vragen.

Page 14: Object Oriented Programming for web applications

Voorbeeld

<?phprequire "Person.php";require "PHPFreak.php";

$oFreak = new PHPFreak("Pietje");echo $oFreak->getNaam();

// Contract overtreding: methode verwacht een integer$oFreak->setSchoenMaat("Klaasje");

// Dit werkt wel$oFreak->setSchoenMaat(46);?>

Page 15: Object Oriented Programming for web applications

Class methods

• Als je op een object een methode aanroept, roep je een instantie methode aan: $oPerson->setName(“Pietje”);

• Je kunt ook statische methoden aanroepen: Person::find(“Klaas”);

• Een statische methode voert iets op class niveau uit en heeft dus geen toegang tot eigenschappen van een object.

class Person {public static function find($sName){return new Person($sName);

}}$oPerson = Person::find(“Pietje”);

Page 16: Object Oriented Programming for web applications

1. Waarom OOP?

2. Basis uitleg over OOP

3. Design Patterns

4. ActiveRecord

5. Model View Controller

6. Extra informatie

7. Vragen

Page 17: Object Oriented Programming for web applications

Design Patterns

Een verzameling van klassen,

• met een bepaalde onderlinge structuur,

• die een oplossing bieden voor veel voorkomende software problemen.

Voorbeelden:

• Singleton

• ActiveRecord

• Model, View en Controller (MVC)

Page 18: Object Oriented Programming for web applications

1. Waarom OOP?

2. Basis uitleg over OOP

3. Design Patterns

4. ActiveRecord

5. Model View Controller

6. Extra informatie

7. Vragen

Page 19: Object Oriented Programming for web applications

ActiveRecord

ActiveRecord vormt een laag op een database en versimpelt het gebruik van een database. SQL queries zijn bijvoorbeeld nauwelijks nog nodig.

Voorbeeld contract van class ActiveRecord:

• find($iID) geeft de rij met het gegeven id terug

• findAll($aConditions = null, $iLimit = null, $iOffset = null) geeft 1 of meer rijen terug die voldoen aan de gegeven condities.

Page 20: Object Oriented Programming for web applications

Voorbeeld

<?phprequire "ActiveRecord.php";

class User extends ActiveRecord { }

// SELECT * FROM user WHERE status > 5 LIMIT 10User::findAll(array("status > ?", 5), 10)

// SELECT * FROM user WHERE id=1$oUser = User::find(1);$oUser->name = "Pietje";

// UPDATE user SET name = "Pietje" WHERE id=1$oUser->save();

?>

Page 21: Object Oriented Programming for web applications

ActiveRecord

• ActiveRecord is te vinden in het CakePHP framework

• Een variant op het ActiveRecord pattern is ook te vinden in het Zend Framework

Page 22: Object Oriented Programming for web applications

1. Waarom OOP?

2. Basis uitleg over OOP

3. Design Patterns

4. ActiveRecord

5. Model View Controller

6. Extra informatie

7. Vragen

Page 23: Object Oriented Programming for web applications

MVC

Het model, view en controller pattern is zeer goed toepasbaar binnen webapplicaties. Je maakt in je code een splitsing tussen:

• Model: je database; bijvoorbeeld een ActiveRecord pattern

• View: je templates; bijvoorbeeld Smarty

• Controller: het afhandelen van verzoeken van een client en het samenvoegen van het model en de view.

Page 24: Object Oriented Programming for web applications

Zonder OOP

Sommige zaken doe je dubbel als je meer acties krijgt:

• Vertalen van een URL naar een aantal handelingen in PHP

• Foutafhandeling bij missende parameters

• Foutafhandeling bij SQL queries

• SQL queries

Sommige zaken zijn onoverzichtelijk:

• HTML tussen je PHP code

• Scheiding tussen de verschillende acties

Page 25: Object Oriented Programming for web applications

Voorbeeld zonder OOP

<?phpif(isset($_GET['action']) && $_GET['action'] == "show"){ if(!isset($_GET['id']) || !is_numeric($_GET['id'])){ exit("Kan geen gebruiker ophalen zonder id"); } $rResult = mysql_query("SELECT *

FROM users WHERE id = ".intval($_GET['id']));

if(!$rResult){ exit("Er ging iets fout: ".mysql_error()); } $oUser = mysql_fetch_assoc($rResult); echo "<h1>".$oUser['name']."</h1>"; echo "<p>".$oUser['email']."</p>";}?>

Page 26: Object Oriented Programming for web applications

Voorbeeld met OOP// User.php<?phpclass User extends ActiveRecord { }?>

// UserController.php<?phpclass UserController extends ApplicationController {

public function indexAction(){ $oUser = User::find($this->params['id']); $this->user = $oUser; } }?>

// index.phtml<h1><?= $this->user['name'] ?></h1><p><?= $this->user['email'] ?><p>

Page 27: Object Oriented Programming for web applications

ModelDe verantwoordelijkheden van het model zijn:

• Een abstractie bieden van de database

• Automatische controle op parameters

• SQL injection tegengaan

ViewDe verantwoordelijkheden van de view zijn:

• HTML weergave mogelijk maken

• Variabelen beschikbaar maken die toegekend zijn in de controller

Page 28: Object Oriented Programming for web applications

Controller

De verantwoordelijkheden van de controller zijn:

• De URL omschrijven naar een aanroep van een bepaalde methode

• Parameters controleren en beschikbaar maken in een instantie variabele

• Variabelen declareren voor de view

De opbouw van een URL is bijvoorbeeld: /user/show/5 De basis class ApplicationController zal dit omschrijven naar een aanroep van de methode showAction in de class UserController.

Page 29: Object Oriented Programming for web applications

Applicatie structuur

• De mappen structuur van een MVC applicatie zal er bijvoorbeeld zo uit zien:

Page 30: Object Oriented Programming for web applications

1. Waarom OOP?

2. Basis uitleg over OOP

3. Design Patterns

4. ActiveRecord

5. Model View Controller

6. Extra informatie

7. Vragen

Page 31: Object Oriented Programming for web applications

De volgende frameworks zijn volledig OOP gebaseerd en kunnen je helpen bij je eerste stappen in OOP land:

• Zend Framework (helaas nog steeds alpha status)

• CakePHP

• Symfony

• CodeIgniter

Frameworks

Page 32: Object Oriented Programming for web applications

Losse classes

Op internet zwerven veel losse classes die je onderdeel van je code kan maken, enkele bekende:

• PHPMailer: e-mail versturen via PHP

• FormHandler: snel formulieren genereren en afhandelen

• FPDF: PDF documenten genereren

• Smarty: template engine

Op phpclasses.org zijn veel classes te vinden

Page 33: Object Oriented Programming for web applications

Conclusie

Page 34: Object Oriented Programming for web applications

Object Oriented Code is like sex.

More people talk about it than are actually doing it.

The few who are doing it are: doing it poorly (sure it will be better next time) and not practicing it safely.

Page 35: Object Oriented Programming for web applications

1. Waarom OOP?

2. Basis uitleg over OOP

3. Design Patterns

4. ActiveRecord

5. Model View Controller

6. Extra informatie

7. Vragen