Autoloading, hoe hoort het?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pieter Jansen

Pieter Jansen

28/01/2012 11:42:08
Quote Anchor link
Beste leden,

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?
 
PHP hulp

PHP hulp

20/02/2025 00:09:25
 
Wouter J

Wouter J

28/01/2012 12:19:14
Quote Anchor link
Ik gebruik wel altijd de __autoload functie. Dat het het laatste redmiddel is vind ik een beetje vreemd. Het werkt goed en is naar mijn mening ook kloppend, nu ben ik niet heel lang bezig met OO scripten dus kan hier fout zitten.

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.
 
Pieter Jansen

Pieter Jansen

28/01/2012 12:43:09
Quote Anchor link
Wouter, ja het werkt inderdaad goed, ik gebruik het zelf ook vaak, maar het is niet de "correcte" manier om te gebruiken. En de structuur om voor elke class een map aan te maken, daar ben ik op tegen. Het is niet nodig, vaak kun je classes prima groeperen binnen een goed georganiseerde mappen structuur. Zo heb ik de meest gebruike REQUEST classes zoals de GET, de POST, de SESSION en de HTTP classes allemaal onder de noemer voor request.

/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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

namespace \Library\Request
{
     class Post
    {
        public function __construct(){}
    }
}

?>


kan in principe direct geinstantieerd worden d.m.v. het use keyword.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

use Library\Request as LR;

$post = new Lr\Post();

?>
 
Pim -

Pim -

29/01/2012 13:17:36
Quote Anchor link
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.
 
Pieter Jansen

Pieter Jansen

29/01/2012 16:17:33
Quote Anchor link
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.
 
Pim -

Pim -

30/01/2012 00:46:29
 
Pieter Jansen

Pieter Jansen

30/01/2012 01:00:05
Quote Anchor link
Dank je, ik zal ze alle drie eens bekijken. Wat heb je zelf als voorkeur?
 
Pim -

Pim -

30/01/2012 02:29:29
Quote Anchor link
Symfony boven Zend, maar dat is vrij persoonlijk.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.