PHP objektorientert programmeringskonsept (OOP) med eksempel
โก Smart oppsummering
Objektorientert programmering i PHP modellerer en applikasjon rundt virkelige objekter ved hjelp av klasser og objekter. Denne gjennomgangen forklarer OOP-prinsippene for innkapsling, arv og polymorfisme, hvordan PHP stรธtter dem, og bygger eksempler pรฅ arbeiderklasse, arv og grensesnitt trinn for trinn.

Hva er OOPs?
Objektorientert programmering er en tilnรฆrming til programvareutvikling som modellerer en applikasjon rundt virkelige objekter som ansatte, biler og bankkontoer. En klasse definerer egenskapene og metodene til et virkelig objekt. 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 handler om รฅ skjule implementeringsdetaljene og kun eksponere metodene. Hovedformรฅlene 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.
- Tillat at den interne implementeringen av klassen endres uten รฅ bekymre deg for รฅ bryte koden som bruker klassen.
- Arv โ dette handler om forholdet mellom klasser. Forholdet har form av en forelder og et barn. Barnet bruker metodene som er definert i foreldreklassen. Hovedformรฅlet med arv er:
- Gjenbrukbarhet โ flere barn kan arve fra samme forelder. Dette er veldig nyttig nรฅr vi mรฅ tilby felles funksjonalitet, som รฅ legge til, oppdatere og slette data fra databasen.
- polymorfisme โ dette handler om รฅ ha et enkelt grensesnitt med mange forskjellige implementeringer. Hovedformรฅlet med polymorfisme er:
- For รฅ forenkle vedlikehold av applikasjoner og gjรธre dem mer utvidbare.
OOP Concepts i PHP
PHP er et objektorientert skriptsprรฅk; det stรธtter alle prinsippene ovenfor. Prinsippene ovenfor oppnรฅs via:
- innkapsling โ via bruk av ยซgetยป- og ยซsetยป-metodene, og tilgangsmodifikatorer.
- Arv โ ved bruk av nรธkkelordet extends
- polymorfisme โ ved bruk av nรธkkelordet implements
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 svรฆrt 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 (-) skilt betyr privat rekkevidde
- 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 begynner med รฅ identifisere trekkene som er felles for alle dyr.
- Alle dyr tilhรธrer en familie, som planteetere, kjรธttetere osv.
- Alle dyr spiser mat
Diagrammet nedenfor viser klassediagrammet for dyret.
La oss nรฅ kode Animal-klassen 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 $family, $foodยป betyr at variablene ikke kan nรฅs direkte utenfor klassen (innkapsling).
- ยซpublic function __construct($familyโฆ)ยป er PHP-konstruktรธrmetoden. Denne funksjonen kalles hver gang en instans av klassen opprettes. I dette tilfellet setter vi family og food.
- ยซpublic function getโฆ()ยป er metoden som brukes for รฅ fรฅ tilgang til familie- eller matverdien (innkapsling)
- ยซpublic function setโฆ()ยป er metoden som brukes til รฅ angi familie- eller matverdien (innkapsling)
Slik implementerer du 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.
Merk at kua arver fra Animal-klassen og definerer sin egen variabel og metoder ogsรฅ.
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 โฆ utvider Animalยป gjรธr at Cow- og Lion-klassene bruker metoder fra Animal-klassen (arv).
Hvordan opprette et 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('Carnivore', '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.
Begge objektene gjenbruker metodene get_family og get_food som er arvet fra Animal-klassen, noe som demonstrerer arv i praksis.
Slik implementerer du polymorfisme i PHP
La oss si at vi รธnsker รฅ utvikle en applikasjon som kobler seg til forskjellige databasemotorer, som f.eks. MySQL og SQL Server, men bruker det samme ensartede grensesnittet. Vi kan lage et grensesnitt som definerer standardmetodene og en abstract-klassen som implementerer de vanlige metodene.
- Interface โ det ligner pรฅ en klasse. Den definerer bare metodene og parameterne.
- AbstracT-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 magemusklene vรฅretract-klasse, grensesnitt og implementeringsklasser.
La oss nรฅ bygge magemusklene vรฅretract-klassen.
<?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,
- magemusklertract-klassenยป betyr at klassen ikke kan brukes direkte til รฅ opprette et objekt
- "$host, $db..." er klassevariabler som er felles for alle implementeringer
- ยซfunction __construct(โฆ)ยป er 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 implementere DBInterface-grensesnittet. Fรธrst, 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 */ } } ?>
Sรฅ, 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
- ยซโฆ implements DBInterfaceยป sikrer at klassen tilbyr standardmetodene uavhengig av hvilken databasedriver som brukes.
Koden som bruker klassene ovenfor vil se slik ut:
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
Eller:
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
Resten av koden ville vรฆre den samme for begge driverne, for eksempel:
<?php $db->db_connect(); $db->insert($data); ?>
Dette er polymorfisme i aksjon: den samme metoden kaller arbeid pรฅ enhver driver som implementerer grensesnittet, slik at den omkringliggende koden aldri endres nรฅr du bytter databasemotorer.





