FileSystem
Ik zat te denken om een FileSystem class te maken waarmee ik bijv. bestanden kan "laden" en opslaan.
Nu zit ik alleen even na te denken over de method names.
Wat betreft het "laden" van bestanden, vraag ik me af hoe ik de methods moet noemen voor deze php functies:
1 include
2 require
3 file_get_contents
Bij 1 en 2 vraag ik me sowieso af of ik niet gewoon alles zal requiren (en dus geen aparte method voor includen). Wat zou een goede functienaam zijn. Gewoon simpelweg loadFile()? En wat is dan een mooie naam voor optie 3? fileGetContent?
Iemand wat tips?
en wat jij nu voorstelt is overbodig. een autoloader is wat je vandaag de dag moet hebben,
http://www.sitepoint.com/autoloading-and-the-psr-0-standard/
Gewijzigd op 24/10/2013 02:10:34 door Ozzie PHP
->save
->remove
Toevoeging op 24/10/2013 11:22:14:
PS: Je moet echt eventjea in de broncode van de Filesystem class van Symfony kijken. Een van de mooiste voorbeelden van iterators :)
Thanks Wouter! Staat load dan voor require of voor file-get-contents?
Even voor de goede orde... als je dus zo'n filesystem class gebruikt, dan gebruik je dus nergens meer require $file, maar in plaats daarvan $file_system->load($file). Correct?
nee
Hoe dan wel?
Trouwens require/include hebben een totaal andere functie dan wat ik onder een file load functie begrijp. PHP verwerkt de code in een require/include, terwijl een load functie de inhoud returnt al dan niet op een verschillende wijze.
Thanks LEDfan. Ik kan in zo'n filesystem een load functie maken die de inhoud van een bestand inlees en returnt... maar wat is dan precies de toegevoegde waarde van zo'n filesytem ten opzichte van de native php functies?
Ozzie, ik zou het loskoppelen met een class Cache die een class FileSystem gebruikt. Dat biedt je later immers de mogelijkheid om voor caching iets anders te gebruiken dan het file system.
Hoi Ward, ik wil een aparte FileCache class maken, die dan gebruik maakt van het filesytem. Die FileCache kan ik later makkelijk wijzigen naar iets anders. Naar wat ik begrepen had regelt zo'n filesystem class alles met betrekking tot files en directories. Een soort file controller eigenlijk. Dus bestanden opslaan, kopieren, directories aanmaken e.d. Echter, waarom hoort het requiren van een file daar niet bij? Is dat een uitzondering?
Je kunt require weliswaar voor HTML, JavaScript, CSS, enzovoort gebruiken, maar dat zou ik niet aanbevelen voor een file cache. De cache heeft namelijk geen parser en geen engine nodig, maar moet gewoon bestanden ophoesten.
Alleen mijn vraag is... waarom zou ik een filesystem class maken? Ik kan ook gewoon in die filecache class gebruik maken van file_get_contents.
Laat ik mijn vraag nog explicieter stellen. Wat is de bedoeling en de toegevoegde waarde van een filesystem class? Wat doet die class, en waarom zou je niet de native php functies gebruiken?
Ozzie PHP op 25/10/2013 13:15:40:
Laat ik mijn vraag nog explicieter stellen. Wat is de bedoeling en de toegevoegde waarde van een filesystem class? Wat doet die class, en waarom zou je niet de native php functies gebruiken?
Omdat je een class kunt gebruiken als wrapper die bijvoorbeeld nu native functie foo() implementeert en volgend jaar de verbeterde native functie foo_two()...
Omdat er verschillende file systems zijn en je bij het omvallen van je provider morgen weer online wilt zijn op een ander platform...
Omdat je start-up zo succesvol is dat je de cache volgend jaar moet verspreiden over drie webservers die één databaseserver delen...
Omdat de filecache bij nader inzien toch te langzaam blijkt en je een memcache wilt gaan gebruiken...
>> Omdat er verschillende file systems zijn en je bij het omvallen van je provider morgen weer online wilt zijn op een ander platform...
Dit snap ik niet helemaal. De php functies blijven toch gewoon hetzelfde ongeacht de provider?
Maar nogmaals... om even zeker te weten dat ik het niet verkeerd begrijp... stel we hebben een file cache class... Normaal zou ik dan dit doen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
function load($id) {
// create file op basis van id
return file_get_contents($file);
}
?>
function load($id) {
// create file op basis van id
return file_get_contents($file);
}
?>
...en met een filesystem zou ik dan dit doen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
function load($id) {
// create file op basis van id
return $this->file_system->load($file);
}
?>
function load($id) {
// create file op basis van id
return $this->file_system->load($file);
}
?>
Dat is toch ongeveer de bedoeling?
Ja, het tweede voorbeeld is eleganter: je laat het laden van een bestand namelijk aan de FileSystem-klasse over. Je zou het bestand via de klasse zelfs nog een behandeling kunnen geven. Met file_get_contents() is het nogal een lokaal gebeuren en kun je weinig meer dan hier en nu een bestand byte-voor-byte van dezelfde server plukken.
Waarom kun je dan geen require method in je filesystem opnemen? Dan zou je bijv. in je autoloader gebruik kunnen maken van het filesystem:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
function autoload($class) {
// bestand opbouwen
$this->file_system->require($file);
}
?>
function autoload($class) {
// bestand opbouwen
$this->file_system->require($file);
}
?>
Wat is hier dan niet goed aan?
Gewijzigd op 25/10/2013 13:49:45 door Ozzie PHP
Ik begrijp je vraag wel, maar ik zou dat niet op één grote hoop vegen. Je krijgt anders een onoplosbare vicieuze cirkel: de autoloader heeft de FileSystem-klasse nodig om klassen te laden, maar zonder de FileSystem-klasse kan de autoloader de FileSystem-klasse zelf niet laden.
Ward van der Put op 25/10/2013 13:54:22:
... een onoplosbare vicieuze cirkel: de autoloader heeft de FileSystem-klasse nodig om klassen te laden, maar zonder de FileSystem-klasse kan de autoloader de FileSystem-klasse zelf niet laden.
Haha, lol... je kan natuurlijk ook de FileSystem class even handmatig requiren in de bootstrap :)
Ward van der Put op 25/10/2013 13:54:22:
De autoloader laadt code, het file system laadt bestanden.
Ah, oké. Hier heb je inderdaad een punt. Hoewel die code natuurlijk ook gewoon in een file staat... alleen je haalt de inhoud niet op, maar je parse't m. Dan zou je dus eigenlijk een parse method krijgen...
Is dat misschien een ideetje? Wat vind je daar dan van?
Misschien vinden sommigen het wel muggenziften wat ik doe, maar ik probeer gewoon even te begrijpen waarom file_get_contents wel in een filesystem zou thuishoren en require niet.
Inderdaad, over het algemeen zal de autoloader alle classes inladen. Maar stel nu je hebt een framework. Ieder project/website maakt gebruikt van dat framework, maar sommige projecten vereisen aangepaste code, uitsluitend bedoeld voor dat specifieke project. Dan zou ik me bijv. kunnen voorstellen dat zo'n project een eigen bootstrap-file krijgt. Vanuit het framework zou je dan kunnen kijken of het betreffende project een bootstrap-file heeft, en zo ja...
Zomaar een fictief voorbeeld, maar het zou kunnen toch?
spl_autoload_register() registreer je autoloaders bij PHP zelf. Daarmee krijg je een soort include-pad: wordt een klasse niet gevonden door de laatst geregistreerde autoloader, dan wordt de op één na laatst geregistreerde autoloader aan het werk gezet. Zo kun je dus verschillende oplossingen/projecten/frameworks stapelen.
Daaraan is inderdaad gedacht: met bijvoorbeeld