autoload: hoe doet php dat?
Bij de creatie van Application-object treed de autoload in werking. Het laat het bestand met de php code in het geheugen zodat die kan uitgevoerd worden.
Is de werking van dat autoloaden zoiets als requere_once? Dus dat de code op die exacte plaats ingesloten wordt. Of is het toch nog anders?
Dit is dus een zeer technische vraag. Immers bij het laden van het User object is dit in de __set functie van de instantie van het Application object.
Dus wie kan mij eens exact uitleggen wat het autoloaden exact inhoud.
Thanks :)
Gewijzigd op 01/01/1970 01:00:00 door Marc Cools
In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn't been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error. "
Oftewel, je krijgt de KANS om ZELF een functie te schrijven, die wordt aangeroepen als je een instance aanmaakt van een class die nog niet gedefinieerd is.
Stel, je hebt 3 mappen waarin je class files hebt staan, en je hebt een nette stijl waarin je al je documenten de volgende naam geeft: <class>.class.php (bijvoorbeeld).
Je kunt dan het volgende doen:
Code (php)
Als je nu een bestand 'classes3/User.class.php' hebt, die de class User definieert, zal alles gewoon werken.
Let op, dit is ter illustratie. Je bepaald dus helemaal zelf wat er gedaan wordt binnen je autoload.
Db_Table_Row hoort bij Db/Table/Row.php.
met dit kan je dan makkelijk je bestanden includen.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
function __autoload($class){
include_once str_replace('_','/',$class).'.php';
}
?>
function __autoload($class){
include_once str_replace('_','/',$class).'.php';
}
?>
Ik was blijkbaar niet duidelijk genoeg.
Ik heb zo 'n autoload functie die de class van de juiste plaats ophaalt.
Maar waar staat die code in de 'sequentie' van de codes.
Bij include staat het daar waar include staat.
Kijkt de php parser eerst naar welke classes er gebruikt worden en via de autoload inlude het deze voor de hoofdcode start? Zet het in een appart geheugenblok en niet sequentieel tussen de andere php code. En wat met of met waarbij TIME_CLASS dan pas eerst (via __autoload) geladen wordt.
Dus waar staat *fysiek* die included code voor de classes?
@Arian
Zeer handige tip!
Geen ini gedoe.
Mag ik vragen waarom dit nodig is om te weten? Gewoon achtergrondkennis? Of denk je tegen een probleem aan te lopen?
Ik wil dat autoloaden goed begrijpen.
Include is simpel: zet hier code uit dat bestand neer. Hier dus. De volgorde van uitvoering is gekend.
stel de volgende code:
Code (php)
Bij het verwerken *zou* het kunnen zijn dat hij de regel met de if leest, interpreteerd en vaststeld dat hij via __autoload eerst de class code moet includen. We krijgen dan:
Code (php)
Maar als die if nu in een functie zit of in een andere class staat. Hoe zit het dan met de scoop van die 'included' class?
Het is dus zoals ik al stelde een *technische* vraag.
Vergelijk het met de werking van de stack en de heap waar variabelen in worden opgeslagen. Hoe maakt php verschil tussen een locale $a en een niet locale $a? Als je een functie gebruikt dan wordt als het ware een lijn getrokken in de stack en daar volgen dan de locale variabelen. Uw functie kan niet voorbij die lijn gaan. Wil je dat wel dan moet je 'global' gebruiken om een referentie naar de variabele aan de andere kant van de lijn te krijgen. Als de functie gedaan is dan word de stack 'gewist' tot aan de lijn.
Dus zo werkt technisch de scoop van variabelen. En is dat ook de reden waarom niet locale variabelen niet beschikbaar zijn, vanwege die 'lijn' dus. Andere talen kunnen dat anders behandelen en is de scoop dus ook anders. Zoals buiten de functie gedeclareerd is binnen de functie wel bruikbaar.
Maar mischien moet ik mij dit allemaal niet afvragen en gewoon aannemen dat het werkt.
...Toch maar niet, ik weet het gewoon graag zodat ik het ten volle begrijp.
;)
Gewijzigd op 01/01/1970 01:00:00 door --
Het stukje onderaan had niets met klassen te maken maar gewoon hoe de stack werkt als je bijvoorbeeld een simpele variabele wel of niet in een functie declareert.
Op je reactie over het laden van de klassen met autoload:
<b>*Waar* staat de code van Class1 *nadat* het geladen is?</b>
Op regel 4 ?
Voor regel 12?
In de heap?
Nog een andere locatie?
Waar, waar, waar, waar staat het?
Wanneer je __autoload (of de functie die jij als callback hebt opgegeven) aanroept include deze dat bestand. Alle "globale" variabelen binnen dat bestand, welken dus niet binnen een functie stonden maar ook geen superglobals zijn, staan nu in de scope van de autoload-functie. Dat lijkt mij de enige logische plek waar je ze kan verwachten.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -