Een vraagje. Stel we hebben deze code:

<?php
class A {

private $foo;

public function __construct($foo) {
$this->foo = $foo;
$b = new B($this->foo);
}

}

class B {

private $foo;

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

}

$array = array('foo' => 'foo', 'bar' => 'bar');

// SITUATIE 1:
$a = new A($array);

// SITUATIE 2:
$object = (object) $array;
$a = new A($object );

?>
Klopt het dat in situatie 1 zowel class A als class B een eigen afzonderlijke "kopie" (property) opslaan van $array?

En klopt het dat er in situatie 2 slechts 1 versie van $array is (het object), en dat de class-properties in class A en B slechts pointers zijn naar $array (het object)?
Dat is inderdaad verhelderend :-) Juist een kernel moet een strenge taakverdeling toepassen. Dat gaat ook wel iets verder dan voor "doorgeefluik" spelen. De kernel zou moeten begrijpen: data x is voor A en data y is voor B.

Overigens is "kernel" wel een nogal aan inflatie onderhevige term. Je bent immers geen besturingssysteem aan het programmeren... Als je het ding nu een "front controller" of een "dispatcher" noemt, wordt de taakopvatting veel concreter: de juiste data naar de juiste service doorgeven.
Ik noem het zelf een processor :) (de class die het request processt) Alleen die naam wordt volgens mij door niemand gebruikt, dus noem ik het hier maar Kernel :)

Maar goed, nu je weet waar het om gaat... wat zal ik dan doen? Die array omzetten in een object zodat er niet telkens verschillende kopieën worden opgeslagen? (zie het voorbeeld in mijn allereerste post), of zal ik iedere keer nadat ik de array heb doorgegeven de class property unsetten? Dus zoiets:

$foo = new Foo($this->array);
unset($this->array);
Ward, kernel is de naam die ook gebruikt wordt door Symfony en het is gewoon te gebruiken.

Ozzie, waarom geef je waardes aan de kernel mee? Hier heeft de kernel niks mee te maken. De enige waarde die de kernel moet krijgen is de request informatie.
Je denkt misschien te veel in termen van een echter kernel. Dan kun je data inderdaad distribueren met multitasking en multithreading, en dan heb je ineens vier processor cores die sleutelen aan dezelfde taak. Dat is te veel eer voor PHP.

Maar concreet... Ik zou de array omzetten in meerdere kleine objecten die gericht worden verwerkt door specifieke services. Zo werken de meeste PHP-kernels omdat dit de meest efficiënte en vooral de best schaalbare en distribueerbare oplossing is. De kernel/controller/processor/dispatcher/whatsinaname blijft daarbij in controle, maar doet weinig meer dan taken delegeren.
>> Ozzie, waarom geef je waardes aan de kernel mee? Hier heeft de kernel niks mee te maken. De enige waarde die de kernel moet krijgen is de request informatie.

Maar dat is ook precies wat ik bedoel! Het gaat om de request informatie, alleen stop ik die data in 1 array.

$array = ['cookie' => $_COOKIE, enz.];
$kernel = new Kernel($array);
Als je dit wilt doen:


<?php
$controlFreak = array(
    'cookie' => $_COOKIE,
    'get'    => $_GET,
    'post'   => $_POST,
    'server' => $_SERVER
);
?>


... en die array ook nog doorgeeft aan verschillende controllers, dan kun je beter een eigen versie van PHP programmeren.

Maar even meer concreet: je doet hier niets anders dan overladen. Je vult namelijk een array met omgevingsvariabelen die worden ingesteld, gereguleerd en gecontroleerd door (meestal) Apache en PHP.
>> ... en die array ook nog doorgeeft aan verschillende controllers, dan kun je beter een eigen versie van PHP programmeren.

Wat bedoel je hiermee Ward? Je bedoelt dat jij in je code gewoon $_COOKIE, $_SERVER enz. gebruikt?

Ik snap (de ironie in) je opmerking even niet. Ik geef gewoon de globals mee, zodat ik daarmee een request service kan opbouwen, waardoor ik straks bijv. dit kan doen:

$container->get('request')->getCookie()->get('foo');

Wat is daar volgens jou mis mee? Wat heeft dat met controlfreak te maken??? Ik kan je echt even niet volgen nu.
Request data in een array? Waar is het Request object gebleven?
Ik moet de request data toch doorgeven aan het request object? Dat doe ik dus middels die array. Die array geef ik aan het request object. Klopt toch? Zo heb je het mij zelf ooit uitgelegd.

@Ward: ik hoop dat je nog even een reactie geeft, want ik snap niet wat je bedoelde.
Je geeft ze aan de request doormiddel van argumenten, niet met een array.

En daarnaast krijgt de kernel een request object, deze moet hij niet zelf aanmaken.

Reageren