[oop] autoloader inregelen
Ola,
Ik heb zelf een autoloader gemaakt waarbij ik de namespaces (uitsluitend) via de constructor doorgeef via een array:
Nu zag ik dat de Composer autoloader van Symfony het anders doet, ongeveer zo:
Nu vraag ik me af wat daar het voordeel eigenlijk van is (als er dat is). Of maakt het niks uit?
Ik heb zelf een autoloader gemaakt waarbij ik de namespaces (uitsluitend) via de constructor doorgeef via een array:
Code (php)
1
2
3
4
2
3
4
<?php
$autoloader = new Autoloader(['foo' => 'path/to/foo', 'bar' => 'path/to/bar']);
$autoloader->register();
?>
$autoloader = new Autoloader(['foo' => 'path/to/foo', 'bar' => 'path/to/bar']);
$autoloader->register();
?>
Nu zag ik dat de Composer autoloader van Symfony het anders doet, ongeveer zo:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$autoloader = new Composer();
$autoloader->add('foo', 'path/to/foo');
$autoloader->add('bar', 'path/to/bar');
$autoloader->register();
?>
$autoloader = new Composer();
$autoloader->add('foo', 'path/to/foo');
$autoloader->add('bar', 'path/to/bar');
$autoloader->register();
?>
Nu vraag ik me af wat daar het voordeel eigenlijk van is (als er dat is). Of maakt het niks uit?
Wat denk/vind je zelf?
@NOLot:
Ik stel een vraag... als ik het antwoord wist zou ik de vraag niet stellen...
Ik stel een vraag... als ik het antwoord wist zou ik de vraag niet stellen...
Na het registeren zou je best nog een klasse kunnen aanpassen door er namespaces aan toe te voegen.
Oké... dat stukje begrijp ik. Van de andere kant....
Op het moment dat je de autoloader aanmaakt en je hebt geen namespaces ingesteld, is er dan wel sprake van een valid object? Je kunt de autoloader registeren, maar er zitten dan geen namespaces in... Vandaar eigenlijk mijn vraag. Is een "lege" autoloader dan toch een valid object omdat je er via de add functie nog namespaces aan kunt toevoegen?? Moet ik dat zo zien?
En nog 2 andere vragen waar je me wellicht bij kunt helpen.
1) De composer autoloader heeft een add method. Vind jij die naam (vanuit jouw persoonlijke voorkeur) goed? Of had je liever addNamespace() als naam gehad?
2) Weet je toevallig of er een reden is waarom bij Composer zo'n add method 2 parameters heeft (een namespace en een path) en waarom ze niet één array als parameter kiezen waardoor je in 1 keer meerdere namespaces kunt meegeven? Dus waarom zo:
en niet zo:
Is dat ook weer een kwestie van persoonlijke voorkeur, of zit daar nog een bepaalde beweegreden achter?
Op het moment dat je de autoloader aanmaakt en je hebt geen namespaces ingesteld, is er dan wel sprake van een valid object? Je kunt de autoloader registeren, maar er zitten dan geen namespaces in... Vandaar eigenlijk mijn vraag. Is een "lege" autoloader dan toch een valid object omdat je er via de add functie nog namespaces aan kunt toevoegen?? Moet ik dat zo zien?
En nog 2 andere vragen waar je me wellicht bij kunt helpen.
1) De composer autoloader heeft een add method. Vind jij die naam (vanuit jouw persoonlijke voorkeur) goed? Of had je liever addNamespace() als naam gehad?
2) Weet je toevallig of er een reden is waarom bij Composer zo'n add method 2 parameters heeft (een namespace en een path) en waarom ze niet één array als parameter kiezen waardoor je in 1 keer meerdere namespaces kunt meegeven? Dus waarom zo:
Code (php)
1
2
3
4
2
3
4
<?php
$autoloader->add('foo', 'path/to/foo');
$autoloader->add('bar', 'path/to/bar');
?>
$autoloader->add('foo', 'path/to/foo');
$autoloader->add('bar', 'path/to/bar');
?>
en niet zo:
Is dat ook weer een kwestie van persoonlijke voorkeur, of zit daar nog een bepaalde beweegreden achter?
De beweegreden is misschien dat de tweede parameter paths van add() ook een array kan zijn:
public add(string $prefix, array|string $paths, bool $prepend = false)
Voor uitgebreidere mapping met een array kun je de methode addClassMap() gebruiken met $classMap voor een "class to filename map":
public addClassMap(array $classMap)
public add(string $prefix, array|string $paths, bool $prepend = false)
Voor uitgebreidere mapping met een array kun je de methode addClassMap() gebruiken met $classMap voor een "class to filename map":
public addClassMap(array $classMap)
Thanks voor je uitleg Ward. Zover was ik nog niet gekomen. Wat vreemd trouwens dat je via de add functie kunt prependen, vind je niet? Je zou toch verwachten dat je die beslisssing pas kunt maken op het moment dat je de autoloader registreert? Of is dit geen prepend van de autoloader-stack, maar een prepend van de namespace zelf binnen de autoloader? Dus stel je hebt namespace 1) foo en 2) bar. En dat je dan foobar toevoegt, en als je die dan prependt, dat het dan 1) foobar, 2) foo en 3) bar wordt. Zou dat het zijn? Als ik de uitleg lees dan lijkt het daar wel op.
Wat vind jij trouwens in dit verband van de method-naam "add"? VInd jij dat duidelijk? Of vind jij dat het addNamespace of iets dergelijks zou moeten zijn?
Wat vind jij trouwens in dit verband van de method-naam "add"? VInd jij dat duidelijk? Of vind jij dat het addNamespace of iets dergelijks zou moeten zijn?
Het is ook geen autoloader, maar een class loader. Het geheel wordt pas een autoloader als je het registreert.
Die $prepend hoort er eigenlijk wel in ja, anders ondersteun je de PHP-autoloading niet volledig.
>> Wat vind jij trouwens in dit verband van de method-naam "add"?
Aangezien er hier verschillende betekenissen zijn van "to add", zou ik die add() inderdaad anders noemen. Hetzelfde geldt voor set(), want wat betekent "to set"? Je kunt van alles "instellen", dus wees dan liever concreter.
Je moet daarvoor nu naar de signature van de methode kijken. De een vindt dat afdoende, de ander niet:
public set(string $prefix, array|string $paths)
Die $prepend hoort er eigenlijk wel in ja, anders ondersteun je de PHP-autoloading niet volledig.
>> Wat vind jij trouwens in dit verband van de method-naam "add"?
Aangezien er hier verschillende betekenissen zijn van "to add", zou ik die add() inderdaad anders noemen. Hetzelfde geldt voor set(), want wat betekent "to set"? Je kunt van alles "instellen", dus wees dan liever concreter.
Je moet daarvoor nu naar de signature van de methode kijken. De een vindt dat afdoende, de ander niet:
public set(string $prefix, array|string $paths)
>> Het is ook geen autoloader, maar een class loader. Het geheel wordt pas een autoloader als je het registreert.
Wat is volgens jou het verschil dan tussen een autoloader en class loader?
Het is toch een autoloader, alleen om 'm te activeren moet je 'm nog even registreren. Toch?
Wat is volgens jou het verschil dan tussen een autoloader en class loader?
Het is toch een autoloader, alleen om 'm te activeren moet je 'm nog even registreren. Toch?
Een autoloader laadt niet-geladen klassen automatisch. Dus ja, van een class loader die weet waar bepaalde klassen vandaan te laden zijn, kun je een autoloader maken door deze te registreren.
Eenvoudige oplossingen zonder autoloader gebruiken bijvoorbeeld wel eens een class loader die wordt getriggerd via class_exists(), function_exists() of defined().
Ik denk zelf dat je een autoloader pas een volwaardige autoloader mag noemen als die de autoloading-functionaliteit van PHP zelf gebruikt. Los je het op een andere manier op, dan is het eerder een class loader of een bootstrap.
Eenvoudige oplossingen zonder autoloader gebruiken bijvoorbeeld wel eens een class loader die wordt getriggerd via class_exists(), function_exists() of defined().
Ik denk zelf dat je een autoloader pas een volwaardige autoloader mag noemen als die de autoloading-functionaliteit van PHP zelf gebruikt. Los je het op een andere manier op, dan is het eerder een class loader of een bootstrap.
Ah, op die fiets. Ik snap 'm :)
Ozzie PHP op 15/06/2014 17:28:24:
@NOLot:
Ik stel een vraag... als ik het antwoord wist zou ik de vraag niet stellen...
Ik stel een vraag... als ik het antwoord wist zou ik de vraag niet stellen...
Dat is nog geen antwoord op mijn vraag. Een eigen mening vormen is helemaal niet slecht. Je loopt echt veel te veel na te denken over dingen, en aan de vragen die je af en toe stelt vraag ik me af of je die tijd niet beter kunt besteden aan het opdoen van ervaring (daadwerkelijk programmeren).
Just my 2 cents...
Oh 2 cents mag je altijd hebben... ik ben alleen tot de conclusie gekomen dat het soms slimmer is om eerst over een juiste aanpak na te denken en daarna pas te gaan programmeren, in plaats van andersom (hoe verleidelijk dat laatste ook is).
Ozzie PHP op 16/06/2014 17:16:19:
Oh 2 cents mag je altijd hebben... ik ben alleen tot de conclusie gekomen dat het soms slimmer is om eerst over een juiste aanpak na te denken en daarna pas te gaan programmeren, in plaats van andersom (hoe verleidelijk dat laatste ook is).
True op het moment dat je al veel kennis hebt is het uitdenken van te voren de logische stap. Ik denk echter dat jij nog lang niet op dat niveau zit, en je veel meer profijt hebt van daadwerkelijk programmeren. Maarja het feit dat je al twee jaar lang dezelfde vragen stelt zegt eigenlijk al meer dan genoeg. Just my 2 cents again...




