PHP Klasser
Klasser
Självklart är en viktig del att kunna bygga egna objekt. Objektorienterad programmering för att få tydliga strukturer. Här förutsätter jag att man har träffat på begreppet klasser i något annat programmeringsspråk.
Delavsnitt
Grunder
Konstruktor
Arv
Överlagring Polymorfism
Static
Protected
Grunder
Vi skapar en klass på enklast möjliga sätt. Variablerna(datamedlemmar) måste deklareras med "public" (man kan se i kod från äldre php-versioner "var" istället). De är nu publika och vi kan komma åt dom med pil-notation. Vi kan både tilldela variablerna värden och hämta värden.
class Friend1 {
public $name="";
public $mobileNr=0;
public function setName($n) {
$this->name = $n;
}
}
// skapa ett objekt
$myFriend = new Friend1();
// sätt egenskaperna direkt
$myFriend->name="Långben";
$myFriend->mobileNr="123";
// skriv ut informationen om vår vän:
echo 'Namn: ' . $myFriend->name . ' <br>'.'Mobilnr: ' . $myFriend->mobileNr;
// sätt nytt namn via metoden setName()
$myFriend->setName("Kalle Anka");
// skriv ut informationen om vår vän:
echo '<br /><br />Namn: ' . $myFriend->name . ' <br>'.'Mobilnr: ' . $myFriend->mobileNr;
?>
Mobilnr: 123
Namn: Kalle Anka
Mobilnr: 123
I nästa exempel ser vi till att skydda variablerna med "private". Detta innebär att vi kan inte komma åt dom med pil-notation utan skriver egna metoder som vi sätter "public" på, så vi kan komma åt dom. Sätter vi inget så tolkas det som "public" (se getName) men gör det till en vana att vara tydlig och sätt alltid ut "public".
class Friend2 {
private $name;
private $mobileNr;
function getName() {
return $this->name;
}
public function getMobileNr() {
return $this->mobileNr;
}
public function setName($name) {
$this->name = $name;
}
public function setMobileNr($mobileNr) {
$this->mobileNr = $mobileNr;
}
}
$myFriend = new Friend2();
$myFriend->setName('Kalle Anka');
$myFriend->setMobileNr('777');
// skriv ut informationen om vår vän:
echo 'Namn: '.$myFriend->getName().'<br>'.'Mobilnr: '.$myFriend->getMobileNr();
Mobilnr: 777
Konstruktor
Konstruktorn är till för att initiera skyddade(helst) variabler när vi skapar ett objekt. Vi har vant oss i andra programmeringsspråk att konstruktorn har samma namn som klassen. Det fungerar här med men från PHP 5.3.3 så rekommenderas att konstruktorn ska heta __construct(...). Det inledande strecket får man med två(2) understreck.
För bakåtkompabilitet så fungerar det så att om programmet inte hittar "__construct()" i klassen soch om den inte ärver från föräldraklassen så letar programmet efter den gamla sättet att skriva konstruktorer, det vill säga en metod med samma namn som klassen.
OBS! PHP har inte överlagring av konstruktorer som många andra programmeringsspråk, utan PHP använder en konstruktor. Det finns sätt att jobba sig runt detta om man vill.
class Friend3 {
private $name;
private $mobileNr;
public function __construct($n, $m) {
$this->name = $n;
$this->mobileNr = $m;
}
public function getName() {
return $this->name;
}
public function getMobileNr() {
return $this->mobileNr;
}
public function setName($name) {
$this->name = $name;
}
public function setMobileNr($mobileNr) {
$this->mobileNr = $mobileNr;
}
}
$myFriend = new Friend3('Musse Pigg', 432);
// skriv ut informationen om vår vän:
echo 'Namn: ' . $myFriend->getName() . ' <br>'.'Mobilnr: ' . $myFriend->getMobileNr();
?>
Mobilnr: 432
Arv
När vi jobbar med arv har vi en superklass och subklass. Vi kan också kala dessa föräldraklass och barnklass. Förälderkonstruktorn ropas ej på då barnkonstruktorn finns. För att ropa på föräldrakonstruktorn skriver man "parent::__construct(...)" om det krävs i barnkonstruktorn. Om barnklassen inte har någon egen konsruktor ärvs den av föräldraklassen (om den där inte är private).
class Friend4 {
private $name;
private $mobileNr;
public function __construct($n, $m) {
$this->name = $n;
$this->mobileNr = $m;
}
public function getName() {
return $this->name;
}
public function getMobileNr() {
return $this->mobileNr;
}
public function setName($name) {
$this->name = $name;
}
public function setMobileNr($mobileNr) {
$this->mobileNr = $mobileNr;
}
}
//==============================================
class EmailFriend extends Friend4 {
private $emailAdress;
public function __construct($n, $m, $e) {
parent::__construct($n, $m);
$this->emailAdress = $e;
}
public function getAll() {
return parent::getName()."<br>".parent::getMobileNr()."<br>".$this->emailAdress;
}
public function setEmailAdress($e) {
$this->emailAdress = $e;
}
}
//==============================================
$myFriend = new EmailFriend('Mimmi Pigg', 432, "mp@disney.se");
$knattarna = array();
$knattarna[0]=new EmailFriend('Knatte', 111, "knatte@disney.se");
$knattarna[1]=new EmailFriend('Fnatte', 222, "fnatte@disney.se");
$knattarna[2]=new EmailFriend('Tjatte', 333, "tjatte@disney.se");
// skriv ut informationen om våra vänner:
echo 'Namn: ' . $myFriend->getAll() . ' <br><br>';
foreach($knattarna as $knatte) echo 'Namn: '.$knatte->getAll().'<br><br>';
?>
432
mp@disney.se
Namn: Knatte
111
knatte@disney.se
Namn: Fnatte
222
fnatte@disney.se
Namn: Tjatte
333
tjatte@disney.se
Överlagring
När vi har metoder med samma namn i flera klasser som ärver varandra så känner den efter vilken typ det är på objektet som anropar metoden och ropar på den aktuella metoden för just sin typ. Detta kallas polymorfism.
class Friend5 {
private $name;
private $mobileNr;
public function __construct($n, $m) {
$this->name = $n;
$this->mobileNr = $m;
}
public function getAll() {
return $this->name."<br>".$this->mobileNr;
}
public function setName($name) {
$this->name = $name;
}
public function setMobileNr($mobileNr) {
$this->mobileNr = $mobileNr;
}
}
//==============================================
class EmailFriend2 extends Friend5 {
private $emailAdress;
public function __construct($n, $m, $e) {
parent::__construct($n, $m);
$this->emailAdress = $e;
}
public function getAll() {
return parent::getAll()."<br>".$this->emailAdress;
}
public function getName() {
return $this->name;
}
public function getMobileNr() {
return $this->mobileNr;
}
public function setEmailAdress($e) {
$this->emailAdress = $e;
}
}
//==============================================
$myFriend = new EmailFriend2('Mimmi Pigg', 432, 'mimmipigg@disney.se');
$knattarna[0]=new EmailFriend2('Knatte', 111, "knatte@disney.se");
$knattarna[1]=new Friend5('Fnatte', 222);
$knattarna[2]=new EmailFriend2('Tjatte', 333, "tjatte@disney.se");
// skriv ut informationen om våra vänner:
echo 'Namn: ' . $myFriend->getName() . ' <br><br>';
foreach($knattarna as $knatte) echo 'Namn: '.$knatte->getAll().'<br><br>';
?>
Namn: Knatte
111
knatte@disney.se
Namn: Fnatte
222
Namn: Tjatte
333
tjatte@disney.se
Obs! I PHP kan vi inte överlagra metoder och konstruktorer i samma klass. Det vill säga, de kan inte ha samma namn men med olika antal parametrar.
"Static" Klassvariabel Klassmetod
Med "static framför en variabel eller en metod så blir de klassvariabel eller klassmetod. Det vill säga de tillhör klassen och inte objekten.
class Friend6 {
private $name;
private $mobileNr;
private static $friends;
public static function allFriends() {
return "Antal vänner: ".self::$friends."<br>";
}
public function __construct($n, $m) {
$this->name = $n;
$this->mobileNr = $m;
self::$friends += 1;
}
public function getAll() {
return $this->name."<br>".$this->mobileNr;
}
public function getName() {
return $this->name;
}
public function getMobileNr() {
return $this->mobileNr;
}
public function setName($name) {
$this->name = $name;
}
public function setMobileNr($mobileNr) {
$this->mobileNr = $mobileNr;
}
}
//==============================================
class EmailFriend3 extends Friend6 {
private $emailAdress;
private static $emailFriends;
public static function allEmailFriends() {
return "Antal mejlvänner: ".self::$emailFriends."<br>";
}
public function __construct($n, $m, $e) {
parent::__construct($n, $m);
$this->emailAdress = $e;
self::$emailFriends += 1;
}
public function getAll() {
return parent::getAll()."<br>".$this->emailAdress;
}
public function setEmailAdress($e) {
$this->emailAdress = $e;
}
}
//==============================================
$myFriend = new EmailFriend3('Mimmi Pigg', 432, 'mimmipigg@disney.se');
$knattarna[0]=new EmailFriend3('Knatte', 111, "knatte@disney.se");
$knattarna[1]=new Friend6('Fnatte', 222);
$knattarna[2]=new EmailFriend3('Tjatte', 333, "tjatte@disney.se");
// skriv ut informationen om våra vänner:
echo 'Namn: ' . $myFriend->getName() . ' <br><br>';
foreach($knattarna as $knatte) echo 'Namn: ' . $knatte->getAll() . ' <br><br>';
echo Friend6::allFriends(); // eller echo EmailFriend3::allFriends();
echo "varav ".EmailFriend3::allEmailFriends();
?>
Namn: Knatte
111
knatte@disney.se
Namn: Fnatte
222
Namn: Tjatte
333
tjatte@disney.se
Antal vänner: 4
varav Antal mejlvänner: 3
public - protected - private
Det finns olika nivår av skydd kontra åtkomst av egenskaper i klasser.
class Friend7 {
private $name;
protected $mobileNr;
public function __construct($n, $m) {
$this->name = $n;
$this->mobileNr = $m;
}
public function getName() {
return $this->name;
}
public function getMobileNr() {
return $this->mobileNr;
}
public function setName($name) {
$this->name = $name;
}
public function setMobileNr($mobileNr) {
$this->mobileNr = $mobileNr;
}
}
//==============================================
class EmailFriend extends Friend4 {
private $emailAdress;
public function __construct($n, $m, $e) {
parent::__construct($n, $m);
$this->emailAdress = $e;
}
public function getAll() {
return parent::getName()."<br>".$this->mobileNr."<br>".$this->emailAdress;
}
public function setEmailAdress($e) {
$this->emailAdress = $e;
}
}
//==============================================
$myFriend = new EmailFriend('Mimmi Pigg', 432, "mp@disney.se");
$knattarna = array();
$knattarna[0]=new EmailFriend('Knatte', 111, "knatte@disney.se");
$knattarna[1]=new EmailFriend('Fnatte', 222, "fnatte@disney.se");
$knattarna[2]=new EmailFriend('Tjatte', 333, "tjatte@disney.se");
// skriv ut informationen om våra vänner:
echo 'Namn: ' . $myFriend->getAll() . ' <br><br>';
foreach($knattarna as $knatte) echo 'Namn: '.$knatte->getAll().'<br><br>';
?>
432
mp@disney.se
Namn: Knatte
111
knatte@disney.se
Namn: Fnatte
222
fnatte@disney.se
Namn: Tjatte
333
tjatte@disney.se
Källor, referenser, bra länkar
PHP.net Classes and Objects
PHP.net Constructors and Destructors
w3schools.com/php/
Filmer