PHP Object Oriented Programming (OOPs) koncept Tutorial med eksempel
Hvad er OOPs?
Objektorienteret er en tilgang til softwareudvikling, der modellerer applikationer omkring objekter fra den virkelige verden, sรฅsom medarbejdere, biler, bankkonti osv. En klasse definerer egenskaberne og metoderne for et objekt i den virkelige verden. Et objekt er en forekomst af en klasse.
De tre grundlรฆggende komponenter i objektorientering er;
- Objektorienteret analyse โ systemets funktionalitet
- Objektorienteret design โ systemets arkitektur
- Objektorienteret programmering โ implementering af applikationen
Objektorienterede programmeringsprincipper
De tre hovedprincipper i OOP er;
- Indkapsling โ det drejer sig om at skjule implementeringsdetaljerne og kun afslรธre metoderne. Hovedformรฅlet med indkapsling er at;
- Reducer softwareudviklingens kompleksitet โ ved at skjule implementeringsdetaljerne og kun afslรธre operationerne bliver det nemt at bruge en klasse.
- Beskyt den interne tilstand af et objekt โ adgang til klassevariablerne sker via metoder som get og set, dette gรธr klassen fleksibel og nem at vedligeholde.
- Den interne implementering af klassen kan รฆndres uden at bekymre dig om at bryde koden, der bruger klassen.
- Arv โ det drejer sig om forholdet mellem klasser. Relationen tager form af en forรฆlder og et barn. Barnet bruger de metoder, der er defineret i den overordnede klasse. Hovedformรฅlet med arv er;
- Genanvendelighed โ et antal bรธrn, kan arve fra samme forรฆlder. Dette er meget nyttigt, nรฅr vi skal levere fรฆlles funktionalitet sรฅsom tilfรธjelse, opdatering og sletning af data fra databasen.
- polymorfi โ det handler om at have en enkelt form, men mange forskellige implementeringsmรฅder. Hovedformรฅlet med polymorfi er;
- Gรธr det nemmere at vedligeholde applikationer og gรธre dem mere udvidelige.
OOP'er Concepts i PHP
PHP er et objektorienteret scriptsprog; den understรธtter alle ovenstรฅende principper. Ovenstรฅende principper opnรฅs via;
- Indkapsling โ via brug af โgetโ og โsetโ metoder mv.
- Arv โ via brugen af โโextends sรธgeord
- polymorfi โ via brug af implements nรธgleord
Nu hvor vi har den grundlรฆggende viden om OOP og hvordan det understรธttes i PHP, lad os se pรฅ eksempler, der implementerer ovenstรฅende principper
Hvad er UML?
Unified Modeling Language UML er en teknik, der bruges til at designe og dokumentere objektorienterede systemer.
UML producerer en rรฆkke dokumenter, men vi vil se pรฅ klassediagrammet, som er meget vigtigt for objektorienteret php-programmering.
Eksempel pรฅ klassediagram
Klassediagramnรธgle
- รverste kasse indeholder klassenavnet
- mellemkasse indeholder klassevariablerne
- nederste boks indeholder klassemetoderne
- minus (-) tegn betyder privat omfang
- mere (+) tegn betyder offentligt omfang
- hash (#) skilt betyder beskyttet omfang
Sรฅdan opretter du en klasse i PHP
Klasse nรธgleordet bruges til at definere en klasse i PHP. Nedenfor er reglerne for oprettelse af en klasse i PHP.
- Klassens navn skal starte med et bogstav
- Klassenavnet kan ikke vรฆre et PHP-reserveret ord
- Klassenavnet mรฅ ikke indeholde mellemrum
Lad os sige, at vi vil skabe en klasse til at reprรฆsentere dyr.
Vi vil starte med at identificere de trรฆk, der er fรฆlles for alle dyr.
- Alle dyr tilhรธrer en familie sรฅsom en planteรฆder, karneval osv.
- Alle dyr spiser mad
Diagrammet nedenfor viser diagrammet for dyret
Lad os nu kode vores dyreklasse
<?php
class Animal
{
private $family;
private $food;
public function __construct($family, $food)
{
$this->family = $family;
$this->food = $food;
}
public function get_family()
{
return $this->family;
}
public function set_family($family)
{
$this->family = $family;
}
public function get_food()
{
return $this->food;
}
public function set_food($food)
{
$this->food = $food;
}
}
?>
HER,
- "privat $familie, $mad" betyder, at variablerne ikke kan tilgรฅs direkte uden for klassen (Encapsulation).
- "public function __construct($family...)" er php-konstruktรธrmetoden. Denne funktion kaldes hver gang en forekomst af klassen er blevet oprettet. I dette tilfรฆlde sรฆtter vi familien og maden.
- "offentlig funktion fรฅ...()" er den metode, der bruges til at fรฅ adgang til familie- eller fรธdevarevรฆrdien (Encapsulation)
- "offentlig funktionssรฆt...()" er den metode, der bruges til at indstille familie- eller fรธdevarevรฆrdien (Encapsulation)
Hvordan implementerer arv i PHP
Vi vil arbejde med en ko og en lรธve. Bรฅde koen og lรธven arver fra Dyreklassen.
Klassediagrammet nedenfor viser sammenhรฆngene.
Bemรฆrk koen arver fra dyreklassen og definerer ogsรฅ sin egen variabel og metoder.
Lad os nu kode Cow-klassen
<?php
class Cow extends Animal
{
private $owner;
public function __construct($family, $food)
{
parent::__construct($family, $food);
}
public function set_owner($owner)
{
$this->owner = $owner;
}
public function get_owner()
{
return $this->owner;
}
}
?>
Lad os nu kode Lion-klassen
<?php
class Lion extends Animal
{
public function __construct($family, $food)
{
parent::__construct($family, $food);
}
}
?>
HER,
- "klasse ... udvider Animal" fรฅr koen og lรธven til at bruge metoder fra dyreklassen (Arv).
Sรฅdan opretter du klassens objekt
Dyr-, ko- og lรธveklasserne bรธr alle vรฆre i den samme mappe for enkelhedens skyld.
Lad os nu oprette applikationen, der bruger vores klasser.
PHP klasse eksempel
<?php
require 'Animal.php';
require 'Cow.php';
require 'Lion.php';
$cow = new Cow('Herbivore', 'Grass');
$lion = new Lion('Canirval', 'Meat');
echo '<b>Cow Object</b> <br>';
echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>';
echo '<b>Lion Object</b> <br>';
echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food();
?>
Tester vores applikation
Lad os nu se vores applikation i en webbrowser
Fantastisk rigtigt! Lad os nu se pรฅ det tredje princip i OOP, polymorfi.
Lad os sige, at vi vil udvikle en applikation, der forbinder til forskellige databasemotorer som f.eks MySQL og SQL Server, men brug den samme ensartede grรฆnseflade.
Vi kan skabe en grรฆnseflade, der definerer standardmetoderne, og en abstrakt klasse, der implementerer de gรฆngse metoder.
- grรฆnseflade โ det ligner en klasse. Den definerer kun metoderne og parametrene.
- Abstrakt klasse โ det er en klasse, der ikke kan bruges til at oprette et objekt direkte. Dens formรฅl er at levere delvise eller hele implementeringer af almindelige metoder.
Klassediagrammet nedenfor illustrerer forholdet mellem vores abstrakte klasse, grรฆnseflade og implementeringsklasser.
Lad os nu skabe vores abstrakte klasse
<?php
abstract class DBCommonMethods
{
private $host;
private $db;
private $uid;
private $password;
public function __construct($host, $db, $uid, $password)
{
$this->host = $host;
$this->db = $db;
$this->uid = $uid;
$this->password = $password;
}
}
?>
HER,
- "abstrakt klasse" betyder, at klassen ikke kan bruges direkte til at oprette et php-objekt
- "$host,$db..." er klassevariabler, der er fรฆlles for alle implementeringer
- "funktion __construct(...)" er php-klassekonstruktรธrmetoden, der sรฆtter de fรฆlles variable vรฆrdier ved initialisering
Lad os nu skabe den grรฆnseflade, der indeholder standardmetoderne, som vil blive implementeret forskelligt afhรฆngigt af databasemotoren.
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
HER,
- "interface" er nรธgleordet for at skabe grรฆnseflader
- "offentlig funktion...(...)" er de standardmetoder, der bรธr implementeres
Lad os nu skabe de konkrete klasser, der udvider DBCommonMethods-klassen og udvider DBInterface-grรฆnsefladen. MySQLDriver.php
<?php class MySQLDriver extends
DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password)
{
parent::__construct($host, $db, $uid, $password); }
public function db_connect() { //connect code goes here }
public function delete($where) { //delete code goes here }
public function insert($data) { //insert code goes here }
public function read($where) { //read code goes here }
public function update($where) { //update code goes here }
} ?>
MSSQLServerDriver.php
<?php
class MSSQLServerDriver extends
DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password)
{
parent::__construct($host, $db, $uid, $password); }
public function db_connect() { //connect code goes here }
public function delete($where) { //delete code goes here }
public function insert($data) { //insert code goes here }
public function read($where) { //read code goes here }
public function update($where) { //update code goes here }
} ?>
HER,
- "klasse ... udvider DBCommonMethods" bruger metoderne i DBCommonMethods
- "... implementerer DBInterface" sikrer, at klassen leverer standardmetoder, uanset hvilken databasedriver der bruges.
Brug af ovenstรฅende kode Koden, der bruger ovenstรฅende klasse, vil se sรฅdan ud
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
Resten af โโkoden ville vรฆre den samme for begge drivere sรฅsom;
<?php $db->db_connect(); $db->insert($data); ?>
Resumรฉ
- Objektorienteret programmering OOP er en kraftfuld teknik, der modellerer applikationer efter objekter i den virkelige verden
- En klasse er en reprรฆsentation af objekter fra den virkelige verden med egenskaber og metoder
- De tre grundlรฆggende principper for OOP er;
- Indkapsling
- Arv
- polymorfi





