Objektorienterad programmering! Vi skall ta oss igenom hur några olika koncept fungerar.
Vad är ett trait?
Hur interagerar ovanstående?
Hur används detta i Laravel?
Ett interface är en form av kontrakt. Interfacet innehåller metoddefinitioner men inga implementationer. Alla klasser som implementerar ett interface måste ha med dessa metoder.
<?php
interface Car {
public function drive() : array;
public function honk() : void;
public function turn(string $direction) : int;
public function accelerate(float $speed) : void;
public function decelerate(float $speed) : void;
}
// Toyota måste innehålla alla metoderna i Car annars blir det fel
class Toyota implements Car {}
class Mercedes implements Car {}
function saveCar(Car $car) {
// Här sparar jag en bil
}En abstrakt klass är en grundimplementation av en klass. Den går inte att instansera utan andra klasser måste ärva den abstrakta klassen.
<?php
abstract class Car {
public function honk() : void {
echo "Honk honk!";
}
}
class Toyota extends Car {};
// Det här går inte!
$car = new Car();
$toyota = new Toyota();
// Honk honk!
$toyota->honk();Traits är en lösning på att klassarv av sin natur är hierarkiskt och går "uppifrån och ner". Ett trait är en knippe funktionalitet som kan läggas till på vilken klass som helst oberoende av arv.
<?php
trait Honkable {
public function honk() : void {
echo "Honk honk!";
}
}
class Toyota {
use Honkable;
};
class Mercedes {
use Honkable;
}
$toyota = new Toyota();
// Honk honk!
$toyota->honk();Bra fråga!
Mycket av det här blir bara aktuellt när du bygger större applikationer tillsammans med andra. Interface är användbara när det behöver finnas flera olika implementationer av samma sak. Då kan vi ha ett interface som berättar vilka metoder som måste finnas i de olika implementationerna.
Abstrakta klasser används för att ge andra utvecklare grundfunktionalitet eller en grundplåt att utgå ifrån. Detta görs såklart bara när det handlar om en större mängd funktionalitet.
Traits används framförallt för små bitar funktionalitet som egentligen inte tillhör en klass huvuduppgifter. Förr så var det ganska vanligt att en klass ärvde en annan bara för att funktionalitet inte skulle behöva kopieras även om de kanske inte egentligen hörde ihop.