Door
Ozzie PHP
op 24-01-2023 22:35
gewijzigd op 24-01-2023 22:36
3.960 views
Ik vraag me iets af. Als je binnen een method meerdere keren dezelfde property aanroept, biedt het dan een voordeel om die property binnen die method in een variabele op te slaan? Met voordeel bedoel ik, is het efficiënter? Of maakt het weinig verschil?
Je kunt dus dit doen:
<?php
public function example() {
$this->foo->doThis();
$this->foo->doThat();
if ($this->foo->count() > 5) {
echo 'okay!';
}
}
?>
Of dit:
<?php
public function example() {
$foo = $this->foo;
$foo->doThis();
$foo->doThat();
if ($foo->count() > 5) {
echo 'okay!';
}
}
$this->bar is hier inderdaad géén object maar een referentie (een reference of alias). Met $bar = $this->bar dupliceer je de referentie, niet het object.
Dat is anders wanneer je werkt met primitieven zoals arrays. Bijvoorbeeld na $server = $_SERVER is $server een complete array, geen referentie.
Als je wilt weten hoe codefragmenten omgaan met geheugengebruik, kun je dat met memory_get_usage() doormeten.
Kijk zo, wordt deze discussie (voor mij) steeds zinvoller. Dus met een lokale variabele dupliceer ik de referentie. Dat is goed om te weten.
N.a.v. jouw eerdere opmerking had ik al getest met [php]memory_get_usage[/php] echter leverde dat (eindstand minus beginstand) telkens 0 op.
De vraag is nu wel ...
Ik kopieer dus via de lokale variabele de referentie naar een object. Toch werkt die lokale variabele iets sneller dan de class property. Ik ben wel benieuwd hoe dat dan kan. Is die lokale variabele een pointer naar de class property die naar het object verwijst? Of verwijst die lokale variabele rechtstreeks naar het object. Ik vermoed dan het laatste en dat zou ook de (zeer minieme) snelheidswinst kunnen verklaren.
Maar als ik het dus goed begrijp (ik hoor graag of dat mijn conclusie terecht is) kost het gebruik van een lokale variabele indien het gaat om een class property die verwijst naar een object géén extra significant geheugenverbruik, omdat het een pointer betreft naar hetzelfde object. Bij meerdere aanroepen binnen 1 method verlopen de aanroepen naar hetzelfde object via een lokale variabele ietsje sneller. Dus het kan zeker geen kwaad om bij meerdere aanroepen binnen 1 method gebruik te maken van een lokale variabele.
?Onbekende gebruiker
27-01-2023 10:15
gewijzigd op 27-01-2023 10:18
Het klopt wat je zegt Ward.
Maar wat ik (en anderen) missen is de logica van PHP waarom een array wel 'by value' wordt gekopieerd. Een array is immers geen primitief type:
Gezien dat PHP afstamt van C, moet je het toch met me eens zijn dat dit gedrag onlogisch is. Scalars zijn primitieve typen, waarbij de value zo klein is dat het in een CPU register past, net als pointers (die op hun beurt weer geen PHP references zijn). Die values worden direct gekopieerd. In C geldt dit niet voor arrays en zelfs niet voor strings. Maar in PHP wel:
PHP verbergt standaard vrij veel voor de programmeur, waardoor programma's al snel minder efficiënt worden dan ze zouden kunnen zijn. Het voorkomt ook fouten, vooral als programmeurs niet helemaal op de hoogte zijn van de details. Maar PHP zit er vol mee waardoor het veel minder simpel is dan het lijkt.