PHP objektorientert programmering (OOPs) konsept Opplæring med eksempel
Hva er OOPs?
Objektorientert er en tilnærming til programvareutvikling som modellerer applikasjoner rundt objekter fra den virkelige verden som ansatte, biler, bankkontoer osv. En klasse definerer egenskapene og metodene til et objekt i den virkelige verden. Et objekt er en forekomst av en klasse.
De tre grunnleggende komponentene i objektorientering er;
- Objektorientert analyse – funksjonalitet til systemet
- Objektorientert design – systemets arkitektur
- Objektorientert programmering – implementering av applikasjonen
Objektorienterte programmeringsprinsipper
De tre hovedprinsippene for OOP er;
- innkapsling – dette er opptatt av å skjule implementeringsdetaljene og kun avsløre metodene. Hovedformålet med innkapsling er å;
- Reduser programvareutviklingskompleksiteten – ved å skjule implementeringsdetaljene og bare avsløre operasjonene, blir det enkelt å bruke en klasse.
- Beskytt den interne tilstanden til et objekt – tilgang til klassevariablene skjer via metoder som get og set, dette gjør klassen fleksibel og enkel å vedlikeholde.
- Den interne implementeringen av klassen kan endres uten å bekymre deg for å bryte koden som bruker klassen.
- Arv – dette handler om forholdet mellom klasser. Forholdet tar form av en forelder og et barn. Barnet bruker metodene som er definert i overordnet klasse. Hovedformålet med arv er;
- Gjenbrukbarhet – et antall barn kan arve fra samme forelder. Dette er veldig nyttig når vi skal tilby felles funksjonalitet som å legge til, oppdatere og slette data fra databasen.
- polymorfisme – dette er opptatt av å ha en enkelt form, men mange forskjellige implementeringsmåter. Hovedformålet med polymorfisme er;
- Forenkle vedlikehold av applikasjoner og gjør dem mer utvidbare.
OOP Concepts i PHP
PHP er et objektorientert skriptspråk; den støtter alle prinsippene ovenfor. Prinsippene ovenfor oppnås via;
- innkapsling – via bruk av “get” og “set” metoder etc.
- Arv – via bruk av extends nøkkelord
- polymorfisme – via bruk av implements nøkkelord
Nå som vi har grunnleggende kunnskap om OOP og hvordan det støttes i PHP, la oss se på eksempler som implementerer prinsippene ovenfor
Hva er UML?
Unified Modeling Language UML er en teknikk som brukes til å designe og dokumentere objektorienterte systemer.
UML produserer en rekke dokumenter, men vi skal se på klassediagrammet som er veldig viktig for objektorientert php-programmering.
Eksempel på klassediagram
Klassediagramnøkkel
- Ocuco Øvre boks inneholder klassenavnet
- Ocuco midtboks inneholder klassevariablene
- Ocuco nedre boks inneholder klassemetodene
- Ocuco minus (-) tegn betyr privat omfang
- Ocuco pluss (+) skilt betyr offentlig omfang
- Ocuco hash (#) skilt betyr beskyttet omfang
Hvordan lage en klasse i PHP
Klasse nøkkelordet brukes til å definere en klasse i PHP. Nedenfor er reglene for å lage en klasse i PHP.
- Klassenavnet skal begynne med en bokstav
- Klassenavnet kan ikke være et reservert PHP-ord
- Klassenavnet kan ikke inneholde mellomrom
La oss si at vi ønsker å lage en klasse for å representere dyr.
Vi vil starte med å identifisere egenskapene som er felles for alle dyr.
- Alle dyr tilhører en familie som planteetere, karneval osv.
- Alle dyr spiser mat
Diagrammet under viser diagrammet for dyret
La oss nå kode dyreklassen vår
<?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, $mat" betyr at variablene ikke kan nås direkte utenfor klassen (Encapsulation).
- "public function __construct($family...)" er php-konstruktørmetoden. Denne funksjonen kalles når en forekomst av klassen er opprettet. I dette tilfellet setter vi familien og maten.
- "offentlig funksjon få...()" er metoden som brukes for å få tilgang til familie- eller matverdien (Encapsulation)
- "offentlig funksjonssett...()" er metoden som brukes til å angi familie- eller matverdien (Encapsulation)
Hvordan implementere arv i PHP
Vi skal jobbe med en ku og en løve. Både kua og løven arver fra Dyreklassen.
Klassediagrammet nedenfor viser sammenhengene.
Legg merke til at kua arver fra dyreklassen og definerer også sin egen variabel og metoder.
La oss nå 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; } } ?>
La oss nå kode Lion-klassen
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
HER,
- «klasse … forlenger Animal» får kua og løven til å bruke metoder fra dyreklassen (arv).
Hvordan lage objekt av klassen
Klassene Animal, Cow og Lion bør alle være i samme katalog for enkelhets skyld.
La oss nå lage applikasjonen som bruker klassene våre.
Eksempel på PHP-klasse
<?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(); ?>
Testing av søknaden vår
La oss nå se applikasjonen vår i en nettleser
Fantastisk rett! La oss nå se på det tredje prinsippet for OOP, polymorfisme.
La oss si at vi ønsker å utvikle en applikasjon som kobles til forskjellige databasemotorer som f.eks MySQL og SQL Server, men bruk det samme enhetlige grensesnittet.
Vi kan lage et grensesnitt som definerer standardmetodene og en abstrakt klasse som implementerer de vanlige metodene.
- Interface – det ligner på en klasse. Den definerer bare metodene og parameterne.
- Abstrakt klasse – det er en klasse som ikke kan brukes til å lage et objekt direkte. Formålet er å gi delvis eller hele implementeringer av vanlige metoder.
Klassediagrammet nedenfor illustrerer forholdet mellom våre abstrakte klasse-, grensesnitt- og implementeringsklasser.
La oss nå lage vår 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" betyr at klassen ikke kan brukes direkte til å opprette et php-objekt
- "$host,$db..." er klassevariabler som er felles for alle implementeringer
- "function __construct(...)" er php-klassekonstruktørmetoden som setter de vanlige variabelverdiene ved initialisering
La oss nå lage grensesnittet som inneholder standardmetodene som vil bli implementert forskjellig avhengig av 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,
- "grensesnitt" er nøkkelordet for å lage grensesnitt
- "offentlig funksjon...(...)" er standardmetodene som bør implementeres
La oss nå lage de konkrete klassene som vil utvide DBCommonMethods-klassen og utvide DBInterface-grensesnittet. 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 ... utvider DBCommonMethods" bruker metodene i DBCommonMethods
- "... implementerer DBInterface" sikrer at klassen gir standardmetoder uavhengig av databasedriveren som brukes.
Bruk av koden ovenfor Koden som bruker klassen ovenfor vil se slik ut
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
Resten av koden vil være den samme for begge driverne som;
<?php $db->db_connect(); $db->insert($data); ?>
Oppsummering
- Objektorientert programmering OOP er en kraftig teknisk som modellerer applikasjoner etter virkelige objekter
- En klasse er en representasjon av virkelige objekter med egenskaper og metoder
- De tre grunnleggende prinsippene for OOP er;
- innkapsling
- Arv
- polymorfisme