Autoloading, hoe hoort het?
Graag wil ik wat meer informatie over de correcte manier van autoload. Ik gebruik vaak de __autoload() methodes om dingen te includen maar zoals sommigen hier wellicht weten is dat eigenlijk niet de correcte manier om classes en interfaces te autoloaden. Het is een last resort middel, dus wanneer al het andere gefaald heeft, wordt de __autoload() nog aangeroepen. Ik ben er op gaan vertrouwen, iets wat eigenlijk erg slecht is. Ik zit er dan ook aan te denken om terug te gaan naar een simpele config waar ik gewoon alle bestanden ga includen. Maar dan denk ik toch: wat zonde van al die resources als ik ze niet allemaal nodig heb..
Nu weet ik dat je met php 5.3 de namespaces kunt gebruiken op zo`n manier dat je ze aan de hand van de namespace kunt autoloaden. Vergelijkbaar met elke willekeurige echte OO taal zoals C# of Java. Uiteraard werkt PHP weer eens heel anders en zitten er addertjes onder het gras. Vandaar dat ik nieuwsgierig ben naar wat de juiste manier is om te autoloaden. Ik ga liever niet voor elke class een mapje maken, al groepeer ik vaak bepaalde classes wel.
Ik heb al gegoogled op het correcte gebruik maar gezien de datering van de meeste artikelen vertrouw ik daar ook niet op.
Waar ik voornamelijk naar kijk is de spl_autoload_extension('.php'); en de spl_autoload_register();
Wie o wie kan mij hier mee helpen?
De structuur om voor elke class een map aan te maken vind ik zelf wel heel handig en lijkt me het ook best. Zo hou je alles goed overzichtelijk.
Voorbeeldje:
WJ_Log_File
verwijst naar:
/lib/log/file/file.php
En WJ_Log verwijst naar
/lib/log/log.php
Dit is heel mooi en simpel te maken met __autoload.
/Request/Get.php
/Request/Post.php
/Request/Session.php
/Request/HTTP.php
Dat werkt prima voor mij, bovendien hou ik de structuur overzichtelijk. Als ik snel een bestand wil inzien hoef ik niet 4 mappen door om vervolgens bij m`n bestand te komen.
Jou naamgeving doet vermoeden dat je de ZEND structuur vast houdt, klopt dit? Los daarvan, ik hanteer zelf niet de Zend standaard, beetje paradoxiaal op sommige punten, waaronder de naamgeving. Voor de rest een prima standaard maar de _ in de naamgeving van classes is tegenstrijdig. Bovendien heeft PHP namespaces inmiddels wat een oplossing is op de naamgevingsproblemen. Doet Zend daar trouwens wat mee?
Afijn, zoals ik al zei, de __autoload() is een bindmiddel, een lapmiddel maar wel eentje die goed werkt, getuige ons gebruik ervan :) Punt is alleen dat het niet de correcte manier is om het op te lossen. Het hoort op een andere manier te kunnen, sterker, als je op een windows server zit, kun je de namespace gebruiken als pad.
Code (php)
kan in principe direct geinstantieerd worden d.m.v. het use keyword.
Mijn visie op correcte autoloading is dat je ofwel psr-0 (namespaces) of zend (underscore) gebruikt en dan een standaard autoloader gebruikt om je bestanden te laden, zoals die van symfony of zend.
Pim, zou je wat meer informatie kunnen verschaffen over beide methodes? Ik heb hierboven de namespace methode al aangereikt maar zal niet werken op linux machines, of eigenlijk werkt het alleen op windows machines. De Zend methode is weer anders, maar de autoloader class, daar ben ik dan wel weer nieuwsgierig naar.
Dank je, ik zal ze alle drie eens bekijken. Wat heb je zelf als voorkeur?
Toevoeging op 30/01/2012 02:30:32:
Even als aanvulling: de eerste twee links zijn classloaders, dus stukken code die de autoloading uitvoeren. De derde is een standaard die richtlijnen geeft voor naamgeving van klassen en locatie van de bestanden.