Hi guys,

Een Processor/Core/Kernel class doorloopt allerlei stappen. Mag de consructor deze stappen triggeren/uitvoeren? Even een heeeeel erg versimpeld voorbeeldje met 3 fictieve functies.

<?php

class Processor {

private $request;

public function __constructor($request) {
$this->request = $request.
$this->initializeRequest();
$this->executeRequest();
$this->sendResponse();
}

}

?>
Zou de constructor deze functies mogen triggeren? Is dat oké volgens het OOP principe?
Wauw, wat is dat lelijk!

Misschien nog eens nalezen wat het doel van een constructor is?
>> Wauw, wat is dat lelijk!

Kun je ook uitleggen waarom Dos? Ik roep geen enkele functie van buiten de class aan. Dus alles moet vanuit de class zelf worden gestart. Hoe kan ik dat dan volgens jou het beste doen?

Ik vind het leuk dat je reageert... maar het is dan ook wel handig als je aangeeft hoe het volgens jou dan wel moet :-)
>> Ik vind het leuk dat je reageert... maar het is dan ook wel handig als je aangeeft hoe het volgens jou dan wel moet :-)


Dos Moonen
Misschien nog eens nalezen wat het doel van een constructor is?


Heb je dat al gedaan?
Een constructor moet een object gebruiksklaar maken. Die constructor van jou doet veel meer.

Een optie is om de constructor private te maken en het meeste van wat nu in de constructor gebeurt verplaatsen naar een public static method.
Dos: ook dat is niet mooi. Een static method die en class aanmaakt is een factory en niks anders en het enige wat een factory mag doen is het aanmaken van een object (die vervolgens zichzelf gebruiksklaar maakt).

Je moet dit soort dingen gewoon nooit bij aanmaken doen :)
@Wouter:

Ik weet wat het doel is. En daar stelde ik dus een vraag over:

Ozzie PHP op 18/05/2014 17:09:16

Zou de constructor deze functies mogen triggeren? Is dat oké volgens het OOP principe?

Volgens Frank mag ik dat doen. Volgens Dos niet?

Wat is dan volgens Dos wél de juiste manier?

@Dos:

>> Een optie is om de constructor private te maken en het meeste van wat nu in de constructor gebeurt verplaatsen naar een public static method.

Wat is dan het wezenlijke verschil als ik vragen mag? En waarom een static method?

Toevoeging op 18/05/2014 20:52:12:

>> Je moet dit soort dingen gewoon nooit bij aanmaken doen :)

Maar dan moet ik het handmatig triggeren dus?

>> En waarom een static method?

Omdat je een object met private constructor niet kunt aanmaken.

>> Maar dan moet ik het handmatig triggeren dus?

Ja, erg hè? :P
>> Omdat je een object met private constructor niet kunt aanmaken.

Oké... maar net zeg je nog dat ik geen static method moet gebruiken :-s

>> Ja, erg hè? :P

Alle gekheid op een stokje. Het gaat er niet om of het wel of niet erg is.

Waar het om gaat is het volgende. En ik hoop dat je dan even kunt meedenken met me ;)

Het enige wat die class kan doen, is een request afhandelen. Niks meer en niks minder. Ward vertelde ooit op het forum dat als je een bepaalde functie hebt die je altijd aanroept na het initialiseren van een class, dat je dan die functie net zo goed in de constructor kunt stoppen, aangezien de functie blijkbaar altijd moet worden aangeroepen. Goed punt toch? Dus vanuit dat oogpunt zou ik de execute functie vanuit de constructor kunnen aanroepen.

Is dit dan wel oké?

<?php

class Processor {

private $request;

public function __constructor($request) {
$this->request = $request.
$this->execute();
}

private function execute() {
$this->initializeRequest();
$this->executeRequest();
$this->sendResponse();
}

}

?>
Nee, de constructor maakt een object klaar voor gebruik. Niks meer niks minder. Hij voert niks uit, hij doet niks, alleen klaar maken voor gebruik.
Het maakt niks uit als hij het uitvoeren naar een andere functie verplaatst en het vervolgens aanroept. Dan gebeurd het nog steeds tijdens de constructie periode.

Ik zou niet eens die Request meegeven als constructor argument, waarom zou je niet 2 verschillende requesten mogen afhandelen met hetzelfde object?

Nogmaals: Is het erg als je 2 requesten afhandelt? Nee toch? Waarom zou je je dan gaan beperken?
>> Ik zou niet eens die Request meegeven als constructor argument, waarom zou je niet 2 verschillende requesten mogen afhandelen met hetzelfde object?

Omdat je per pagina-aanroep maar 1 request kunt afhandelen.

Maar oké... dus jij zegt: niks aanroepen vanuit de constructor.

Ben jij het dan niet eens met de opmerking van Ward? Dus dat wanneer je altijd dit doet:

<?php
$core = new Core($request);
$core->execute();
?>
Dat je dan net zo goed die execute method kunt aanroepen vanuit de constructor?

Reageren