Načrtovanje in razvoj spletnih aplikacij

Konstruktorji v PHP

Pomembni deli razredov so tudi konstruktorji. Konstruktor je funkcija, ki nosi isto ime kot razred, v katerem je definirana. Konstruktorji so avtomatsko klicani, ko ustvarimo nov predmet razreda new.

Da si bomo lažje predstavljali delo z objekti, si poglejmo primer, pri katerem imamo razred Avto. Za vsak avto v aplikaciji lahko sedaj tvorimo svoj objekt, v katerem se nahajajo informacije o posameznem avtomobilu, v tem primeru bo to zgolj spremenljivka $model, ki je označena kot private.

Vzemimo primer, da imamo v naši aplikaciji A4 Quattro in Golf. Zanju ustvarimo dve ločeni instanci razreda Avto, vrednosti tem instancam pa nastavimo preko metode setModel(), neposreden dostop zunaj razreda do imena je namreč zaradi privatnosti lastnosti $model nedovoljen!

Če želimo nastavljeno lastnost prebrati, pa moramo uporabiti metodo getModel(). Metodi na ta način postaneta ključni za komunikacijo izven objekta. 

Primer razreda:
class Avto {
   private $model = ''; // privzeta vrednost

   function setModel($model) {
      $this->model = $model;
   }

   function getModel() {
      return $this->model;
   }
}

Primer konstruktorjev:

<?php
   //primer, kjer je razred definiran v drugi datoteki
   require_once('avto.php');
    
   $a4quattro = new Avto(); //izdelamo objekt
   $a4quattro->setModel('A4 Quattro');
    
   $golf = new Avto(); //izdelamo objekt
   $golf->setModel('Golf');
    
   echo $a4quattro->getModel() . "<br />{$golf->getModel()}";
   echo $golf->model . '<br />' . $a4quattro->model; //napaka, ni dovoljeno
?>
Slika spletne strani primera: konstruktor

$this je kazalec na trenutno instanco razreda. Objekte kreiramo z operatorjem new, ki vrne referenco (kazalec) na ustvarjen objekt. Razred ima lahko še konstruktor in destruktor, konstruktor je metoda __construct(), ki se izvede samodejno ob izdelavi instance in je namenjena inicializaciji spremenljivk objekta, destructor je metoda __destruct(), ki se izvede samodejno, ko ni več referenc na objekt ali je objekt eksplicitno uničen. Imamo še modifikatorje dostopa:

  • public – dostop dovoljen od povsod,
  • private – dostop dovoljen samo iz lastnega razreda,
  • protected – dostop dovoljen iz lastnega in iz izpeljanih razredov.
<?php
   class Avto {
      private $model;
      function __construct() {
         echo "Kličemo konstruktor!<br />";
         $this->model = "Nedefinirano<br />";
      }
      
      function __destruct() {
         echo "Kličemo destruktor!<br />";
      }
      
      function setModel($model) { $this->model = $model; }
      function getModel() { return $this->model; }
   };
      
   $model = new Avto();
   echo $model->getModel();
   $model = NULL; // kliče destruktor, isto se zgodi pri unset()
?>
Kličemo konstruktor!
Nedefinirano
Kličemo destruktor!