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)?
Ja, dit klopt. En welkom in de vage wereld van PHP! Alles is zonder reference, behalve als een functie van binnenuit aangeeft dat het met reference moet, met als uitzondering dat objecten altijd by reference doorgegeven worden.
Aha... oke :)

Maareh... ik heb dus een array met informatie die ik door moet geven via een paar classes. Maar om te voorkomen dat ik dan meerdere kopieën krijg, kan ik dan beter die array in het begin even omzetten naar een object? Of is dat een rare gedachte?
Waarom wil je niet meerdere kopiën?
Ik heb in dit specifieke geval maar 1 versie nodig en niet meerdere kopieën. Als ik meerdere kopieën heb, dan neemt het (in deze specifieke situatie) alleen maar onnodig geheugen in beslag. Vandaar dat ik dus dacht om er een object van te maken. Wat vind jij van dat idee?
ohnneeee... onnodig geheugen. Ik haak af van deze discussie...
Is gewoon een gerechtvaardigde vraag hoor Wouter. Hoef je niet meteen af te haken als ik het woordje "geheugen" laat vallen. Dat zou een zwaktebod zijn en zo ken ik jou niet.

De vraag is heel simpel... waarom zou je het niet doen? IK heb de array in dit geval maar 1x nodig (omdat die bewerkt moet worden). Waarom zou ik er dan meerdere kopieën van opslaan? Geef mij maar 1 goede reden?
Omdat ik niet wil dat de array veranderd in method A als method B er iets anders mee gaat doen. Wat ik meegeef aan een method moet ik zeker weten. Wat een method er dan zelf mee gaat doen is aan die method. Tevens kan je niet on-call een argument by-reference meegegeven, maar moet je dit in de method definitie doen. Waardoor de method altijd by-reference callen gebruikt.

Voorbeeldje:
<?php
function junk(&$a) {
$a = 'hehehe, ik ga dit scriptje lekker verpesten';

return true;
}

function first(&$a) {
return $a[0];
}

$array = str_split('foobar');

junk($array);

echo first($array); // ERROR, cannot get element [0] from string
?>

En daarnaast kun je nu ook nooit meer first(array(1,2,3)) doen.

En als laatst is by-reference vanuit een functioneel oogpunt heeeel erg fout.
Kijk, nu kom je met argumenten ;)

Ik snap wat je bedoelt. Nu gaat het in dit geval puur om een "doorgeefluik". De ene class geeft de array door aan een andere, en alleen de laatste class doet er uiteindelijk iets mee. Maar goed, ik snap wel wat je bedoelt. Het alternatief om te voorkomen dat ik onnodig veel kopieën maak, is dat ik de class property unset nadat ik deze heb doorgegeven aan de volgende class, maar dat is ook weer zoiets... ik weet niet wat dan beter is??
Deze ...
Ozzie PHP op 30/10/2013 20:36:07
Maareh... ik heb dus een array met informatie die ik door moet geven via een paar classes.

... plus deze ...
Ozzie PHP op 30/10/2013 21:09:02
Nu gaat het in dit geval puur om een "doorgeefluik". De ene class geeft de array door aan een andere, en alleen de laatste class doet er uiteindelijk iets mee.

... moet je misschien omdenken. Je verkast, als ik het zo lees, kennelijk nogal wat data tussen klassen die helemaal niets met die data kunnen, moeten of willen. Pas aan het einde van de rit heb je beet.
Ward, om het wat concreter te maken... ik heb een kernel class. Aan die class geef ik de global data mee. Die global data wil ik uiteindelijk in een service zetten, maar dat doe ik weer via een aparte class. Vandaar dat ik de data dus moet "doorgeven". Ik zou niet weten hoe ik dat anders zou moeten doen.

Reageren