This is an old revision of the document!


Genomgång 11 - Objektorienterad programmering

Viktgt att du lär dig vad som menas med följande och att du kan skilja dem åt:

Klass
Objekt
Attribut
Metod
Konstruktor
Arv

Läs mer här

Exempel 1

<?php
 
// Klassen kan ligga i samma fil som huvudprogrammet, men försök att lägga det i separat fil som i exempel 2.
 
class Counter{
 
  private $value;
 
  public function __construct(){
    $this->value = 0;
  }
 
  public function klick(){
    $this->value++;
  }
 
  public function getValue(){
    return $this->value;
  }
 
  public function zero(){
    $this->value = 0;
  }
}
 
 
// Här börjar huvudprogrammet.
 
include('head.php');
 
$a = new Counter();
echo $a->getValue() . '<br>';
 
// $a->value--; // Går inte att komma åt eftersom attributet är private.
 
$i = 0;
while ($i < 20){
  $a->klick();
  $i++;
}
echo $a->getValue() . '<br>';
 
$b = new Counter();
$b->klick();
echo $b->getValue() . '<br>';
 
$b->zero();
echo $b->getValue() . '<br>';
 
include('foot.php');

Exempel 2

<?php
include('head.php');
include('animals.php');
 
 
$a1 = new Animal();   // Skapar en ny instans (objekt) av klassen Animal. Vikten blir 0 (se klassen).
echo 'Djur 1 har vikt: ' . $a1->getWeight() . '<br>';  // -> för att komma åt objektets metoder.
 
$a2 = new Animal(23); // Skapar en ny instans (objekt) av klassen Animal med vikt 23.
$a2->setLegs(2);  // Ändrar till 2 ben.
echo 'Djur 2 har vikt: ' . $a2->getWeight() . '<br>';
echo 'Djur 2 har ' . $a2->getLegs() . ' ben<br>';
echo $a2->info();
 
$d1 = new Dog(18); // Skapar en ny instans (objekt) av klassen Dog.
$d1->setLegs(3);  // Versionen av setLegs i Dog körs så inget ändras.
echo 'Hund 1: ' . $d1->getLegs() . '<br>';
echo 'Hund 1: ' . $d1->getWeight() . '<br>';
echo $d1->info();  // Det kan vara bra att fatta vad som händer här...
 
include('foot.php');

Klasserna ligger i en separat fil, animals.php. Här har jag två klasser i samma fil, men ofta har man en fil per klass.

<?php
 
class Animal {
 
  // Alla attribut ska vara private eller protected för att kapsla in dem.
  // Metoder som ska gå att komma åt utifrån deklareras som public.
  protected $weight;  // Går att komma åt denna variabel i underklassen Dog om det är satt som protected.
  private $legs; // Kommer inte åt denna variabel i underklassen Dog om det är satt som private.
 
  public function __construct($weight=1000){  //Defaultvärde kan anges.
    $this->weight = $weight;
    $this->legs = 10;
  }
 
  public function getWeight() {
    return $this->weight;
  }
 
  public function setWeight($weight) {
    $this->weight = $weight;
  }
 
  public function getLegs() { 
    return $this->legs;
  }
 
  public function setLegs($legs) {
    $this->legs = $legs;
  }
 
  public function info() {
    return 'vikt: ' . $this->getWeight() . ' ben: ' . $this->getLegs() . '<br>'; 
  }
}
 
 
class Dog extends Animal {
 
  // Ny definition av konstruktorn som sätter antal ben till 4.
  public function __construct($weight=1000){
    $this->weight = $weight;
    parent::setLegs(4); // Anropar versionen av funktionen i Animal.
  }
 
  // Ny definition av funktionen som också finns i Animal så att det inte ska gå att ändra antal ben.
  public function setLegs($legs){
  }
 
  // Ny definition av funktionen som också finns i Animal. 
  public function getWeight(){
    return 'Hunden har vikten: ' . $this->weight;
  }
 
  // Ny definition av funktionen som också finns i Animal.
  public function getLegs() {
    return 'Hundben: ' . parent::getLegs(); // Anropar versionen av funktionen i Animal.
  }
 
  // Övriga funktioner ärvs från klassen Animal (parent) till klassen Dog (child).
 
}