set_include_path
Gebruiken jullie de functie set_include_path?
En zo ja, wat is precies het nut ervan? Als je iets wil includen kan je toch gewoon zelf het path aangeven? Wat is dan precies het nut / de toegevoegde waarde van deze functie?
Ik heb het gebruikt voor een Zend project want daarbij moeten meerdere beatanden geinclude worden, dus dan is 'Zend/Loader.php' toch makkelijker dan '/home/koen/lib/includes/Zend/Loader.php, want ik zet het Zend framework maar 1 keer op de server, anders heb je 10 versies die je moet updaten (als je 10 Zend websites hebt).
Dus stel normaal zou je bijvoorbeeld zeggen:
include 'home/user/library/myclass.php';
En dan doe je set_include_path('home/user/library');
En als je dan iets include wordt het:
include 'myclass.php';
Begrijp ik het zo goed?
Gewijzigd op 31/01/2013 13:48:29 door kees Schepers
Maar is het dan zinvol om met set_include_path een include path in te stellen en in je autoload functie "myclass.php" te includen... of kun je in je autoload functie beter het volledige pad home/user/library/myclass.php gebruiken?
Gewijzigd op 31/01/2013 13:55:58 door Ozzie PHP
Ozzie PHP op 31/01/2013 13:55:17:
Maar is het dan zinvol om met set_include_path een include path in te stellen en in je autoload functie "myclass.php" te includen... of kun je in je autoload functie beter het volledige pad home/user/library/myclass.php gebruiken?
De belangrijkste overwegingen worden hier genoemd:
http://framework.zend.com/manual/1.12/en/performance.classloading.html
Ik weet precies welke paden ik ga gebruiken om classes te laden. Is het niet beter om gewoon een absoluut pad te gebruiken in plaats van een include path te setten. Ik hoop dat je begrijpt wat ik bedoel.
Stel ik heb 3 locaties waar mijn classes staan. Dan kan ik in mijn autoload functie dit doen:
// creëer bestandsnaam van class
// bepaal aan de hand van de bestandsnaam welke locatie van toepassing is
// als locatie 1, dan include class vanaf locatie 1 (home/user/library1/myclass.php)
// als locatie 2, dan include class vanaf locatie 2 (home/user/library2/myclass.php)
// als locatie 3, dan include class vanaf locatie 3 (home/user/library3/myclass.php)
Of ik stop die die 3 paden home/user/library1, home/user/library2 en home/user/library3 in de set_include_path functie en dan wordt mijn autoload functie zoiets:
// creëer bestandsnaam van class
// include classnaam
// nu worden alle ingestelde paden gescand of de bestandsnaam bestaat
// indien een 'hit' wordt gevonden, include het bestand
Ik denk dat de 1e optie beter is, omdat je dan gericht zegt welke directory gebruikt moet worden, en dus niet alle direcotries worden gescand op een mogelijke 'hit'.
Ben jij het daar mee eens?
Gewijzigd op 31/01/2013 15:14:30 door Ozzie PHP
Als je inderdaad precies weet (a) wanneer je (b) welk bestand (c) waarvandaan moet halen, heb je geen include path nodig voor allerlei directoryscans, maar is een absoluut pad beter. Je hebt dan meer een bootstrapper dan een autoloader.
Als ik zeg $class = new Class(); dan wordt de autoloader gestart, dus ik snap niet helemaal wat je bedoelt met dat het meer een bootstrapper is dan een autoloader.
Misschien moet je trouwens eens naar namespaces kijken, want daar bestaat een verband tussen klassennamen en paden dat lijkt op jouw structuur met /library1/, /library2/, enzovoort:
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
Thanks voor de tip, maar ik vind dat namespaces niet zo prettig werken. Een hoop extra dingetjes erbij. Ik hoe het maar bij mijn normale manier.