Wist je dat je een class meerdere keren kan constructen?

Ik vond het wel grappig. Je zou verwachten dat dat niet kan.

<?php

class Foo {

public function __construct() {
echo 'hoi';
}

}

$foo = new Foo();
$foo->__construct();
$foo->__construct();


// hoihoihoi

?>
Ozzie PHP op 08/05/2014 16:41:38

construct => bouwen, construeren, opbouwen, samenstellen

Iets wat reeds gebouwd is, kun je niet nogmaals bouwen... het is immers al gebouwd.
Het doel van de constructor is het opbouwen/initialiseren van het object.

Even een leuk voorbeeld voor jou dan. Stel we maken een vliegtuigje in lego.


Dit vliegtuigje kan ik niet nogmaals bouwen, want het is al gebouwd. Het enige wat ik kan doen is een nieuw vliegtuigje bouwen (nieuwe class) of dit vliegtuigje afbreken (destruct) en vervolgens opnieuw opbouwen. Maar iets wat al gebouwd is nogmaals bouwen... dat kan niet.


Of je koopt een nieuwe doos lego, en bouwt een 2e.

>> Hadden ze __construct() dan niet beter ___onConstruct() kunnen noemen, want wat er in de methode staat geeft toch aan wat er op het moment van aanmaken moet worden uitgevoerd? Of zie ik dit verkeerd?

Klopt inderdaad. En daarom is het dus ook raar dat je __construct meer dan 1x kunt aanroepen.

>> Of je koopt een nieuwe doos lego, en bouwt een 2e.

Wat ik dus ook al zei "Het enige wat ik kan doen is een nieuw vliegtuigje bouwen (nieuwe class)...".
Maar in het echt zijn twee vliegtuigjes nooit 100% identiek, zelfs als ze uit de fabriek komen. Een class kan dat wel zijn.
Een class is ook nooit uniek, ze hebben altijd een andere instance.
Ja? Als je precies dezelfde regels schrijft, dan gebeurd er toch hetzelfde (ookal zal die aangeven dat die class al aangeroepen is).
Wat bedoel je Jaap? Ik snap echt niet wat je bedoelt.
Snelle Jaap:
<?php
class User
{
public $name;

public function __construct($name)
{ $this->name = $name; }
}

$jaap1 = new User('Jaap');
$jaap2 = new User('Jaap');

$jaap1 === $jaap2; // false
var_dump($jaap1); // object(User)#1 (1) { ... }
var_dump($jaap2); // object(User)#2 (1) { ... }
?>
Ze zijn niet hetzelfde. Ze zijn beide een andere instance.

[hr]

Ik heb hier trouwens nog even over nagedacht en eigenlijk is het inderdaad heel krom dat de constructor in PHP gewoon een functie is. In JavaScript heb je gewoon een functie die het object terugstuurt, maar die zelf geen onderdeel is van het object. In ruby heb je een functie die private is die als constructor dient. Ik weet niet hoe Java dit afwerkt, maar krom is het wel. Maar goed, dat zijn we gewent :)
Blij dat jij nu in ieder geval ook begrijpt wat ik bedoel ;)

Reageren