[oop] autoloader inregelen
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?
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.
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?
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)
De beweegreden is misschien dat de tweede parameter paths van 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)
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?
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)
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?
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...