__construct

Hoe en wat
De functie __construct (ook wel de constructor genoemd) kan worden gedefinieerd binnen een class. De functie wordt aangeroepen wanneer er een instance van deze class wordt gemaakt. Ik zal direct een voorbeeld geven om het duidelijk te maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

class PHPhulp {
    public function __construct() {
        echo 'Er is een instance van PHPhulp gemaakt!';
    }
}


$instance = new PHPhulp;

?>


Bovenstaand script zal als output hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Er is een instance van PHPhulp gemaakt!


Je kunt ook één of meerdere arguments meegeven aan __construct, net als bij iedere normale method binnen een class. Voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

class PHPhulp {
    public function __construct($printmij) {
        echo $printmij;
    }
}


$instance = new PHPhulp('PHPerik');

?>


Bovenstaand script zal als output hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
PHPerik



In de praktijk
In de praktijk wordt deze functie heel veel gebruikt en is het handig om zo bij het instantiëren van de klasse al een aantal instellingen te setten. Zo kun je bijvoorbeeld een functie aanroepen die een bepaalde variabele vult. Weer een voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

class PHPhulp {
    public $status;

    public function __construct($naam) {
        $this->status = $this->bepaalStatus($naam);
    }


    private function bepaalStatus($naam) {
        if ($naam == 'PHPerik' || $naam == 'Bas Kreleger' /* etc */) {
            return 'phphulpteam';
        }


        else {
            return 'phphulpuser';
        }
    }
}


$instance = new PHPhulp('PHPerik');

?>


Het script heeft nu aan de hand van de parameter $naam bepaald dat ik PHPerik ben en dus lid ben van het PHPhulp team. Dit is opgeslagen in $this->status. Zo kun je dus direct al een belangrijke variabele setten aan de hand van een function. Zo kun je nog veel meer toepassingen bedenken voor construct.


Private construct & Singleton Design Pattern
Als je een constructor private maakt, dan kun je geen instantie van een klasse meer maken buiten de klasse zelf. Nu denk je: wat heb je dan nog aan die klasse? Nou; veel. Het is soms wenselijk dat een instantie van een klasse maar één keer aangemaakt kan worden. Bijvoorbeeld bij een database-klasse. Om dit te doen kun je een instantie van de klasse maken door een static function te gebruiken, zodat de instantie binnen de klasse zelf wordt gemaakt. Dit design pattern heet Singleton. Hier een voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

class DB {
    private static $db_instantie;
    private $connectie;
    
    private function __construct() {
        $this->connectie = mysql_connect();
    }


    public static function getInstance() {
        if (is_null(self::$db_instantie)) {
            self::$db_instantie = new DB();
        }

        
        return self::$db_instantie;
    }
}


$db = DB::getInstance();

?>


Ik zal dit even nader toelichten. Zoals je ziet roep je de statische functie getInstance() aan met DB::getInstance(). Deze functie bepaalt vervolgens of er al een instantie is van de klasse. Als die instantie er als is, dan bevat $db_instantie dus een waarde. Zoals je ziet controleert de functie of er een
waarde is met is_null(). Als $db_instantie inderdaad NULL is, dan maakt de functie een nieuwe instantie van de klasse aan en wordt er een mysql_connect() uitgevoerd door de constructor van de klasse. Als de $db_instantie echter niet NULL is, dan returnt hij de $db_instantie die reeds bestaat.

In de praktijk is dit handig omdat je niet wil dat er meerdere connecties naar een database gemaakt worden. Op deze manier kun je makkelijk met includes werken die allemaal zelf de DB-klasse aanroepen. Als er namelijk al connectie is, dan returnt hij die instantie, en als er nog geen connectie is dan maakt hij een nieuwe connectie/instantie. Je hebt dus nooit last van twee resources en je hoeft ook niet te letten op waar je wel en niet de DB klasse instantieert; de klasse regelt het namelijk zelf.

Let wel op dat bovenstaande klasse slechts een deel is van een normale database-klasse. Je zal binnen deze klasse namelijk nog je functies voor select, insert, etc, moeten definiëren. Singleton wordt dus toegepast binnen een class, het is niet een aparte class op zich.


Parent constructors
Als je een klasse aanroept die een parent-class heeft, dan wordt alleen de constructor van de child-class aangeroepen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

class A {
    public function __construct() {
        echo 'Foo';
    }
}


class B extends A {
    public function __construct() {
        echo 'Bar';
    }
}


$instance = new B;

?>


Bovenstaand script zal als output hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Bar



Je kunt echter de parent constructor wel aanroepen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

class A {
    public function __construct() {
        echo 'Foo';
    }
}


class B extends A {
    public function __construct() {
        parent::__construct();
        echo 'Bar';
    }
}


$instance = new B;

?>


Bovenstaand script zal als output hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
FooBar

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Inleiding
  2. __construct
  3. __destruct
  4. __sleep & __wakeup
  5. __toString
  6. __clone
  7. __autoload
  8. __set_state
  9. __get, __set, __call, __isset, __unset
  10. Links

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.