PHP Framework
Ik ben bezig met het schrijven van een PHP framework/cms:
Het ziet er op zich netjes uit, maar wat ik me dus afvraag... waarom DEFINE je een PHP_SUFFIX, een INI_SUFFIX en een DS(directory separator)?
Dat verandert toch nooit? Is dat dan geen overkill? Vervolgens ga je uit al die defines je include-paden opbouwen wat volgens mij niet ten goede komt aan je performance.
Dit:
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
kun je toch gewoon vervangen door:
include CORE_FOLDER . '/CoreErrorHandler.php';
Beter toch? Ik heb een vraagje... in een van je bestanden zie ik dit:
Ten tweede heb ik wat benchmarks gedaan en:
Zonder Constants: Took 0.00025105476379395 miliseconds
Met Constants: Took 0.00065803527832031 miliseconds
Code 1:
Dit schilt echter zo weinig dat ik me er niet ga over ontfermen. Ten eerste, inderdaad, de PHP_SUFFIX verandert nooit, en daarom is het een constant (constantly variable)
"Ten eerste, inderdaad, de PHP_SUFFIX verandert nooit, en daarom is het een constant (constantly variable)"
Ik ben gewoon benieuwd waarom je een bestandsextensie in een define stopt. Misschien zie ik het verkeerd, maar het komt op mij over alsof je het jezelf onnodig moeilijk maakt. Weet je wat laat ik eens in plaats van .php overal PHP_SUFFIX gaan typen. Die .php zal toch nooit anders worden... dat is eigenlijk wat ik bedoel.
Ik ben benieuwd hoe andere members hier tegenaan kijken... Waar het mij om gaat is... waarom je alles in DEFINES stopt.
Ben het helemaal met je eens. Verder vind ik elk mogelijk tijdverschil toch niet onverstandig om is over na te denken. Je moet enigszins de keuze maken tussen snelheid (performance) en gemak. In dit geval denk ik dat op beide punten kan winnen, weg met onnodige constanten en dan volgt het twee ook. Time is money!
(typo) @Ozzie Dus grote PHP frameworks zoals CakePHP kiezen ook voor gemak?
Nee. Windows gebruikt '\' en Unix systemen '/'. Als je je framework op IIS wilt zetten dan hoef je enkel DS aan te passen als je het op de manier van Fabian doet.
Als je het verstandig vind om rekening te gaan houden met een performancewinst van vier tienduizenste van een milliseconde dan ben je naar mijn inzien verkeerd bezig. Het is veel belangrijker om op een goede manier te coden en je script goed onderhoudbaar, portabel e.d. te maken. PHP performance optimalisatie is iets waar alleen de grote websites op het web zich druk om hoeven te maken. Veel belangrijker is om je content te comprimeren, gzippen, enzovoorts. Dat kan je een paar seconden laadtijd schelen.
Edit:
Mijn feedback over het framework: het is nog erg in opbouw. Wat ik zie ziet er opzich goed uit. In de class Object viel me het volgende op:
Dit lijkt me een beetje dubbel en ik zie er het voordeel niet van in. Een class die van Object overerft kan toch met parent::__construct(); deze aanroepen. Of wil je als het object al bestaat nogmaals construct() kunnen aanroepen?
MVC zou ik er echt gaan inbouwen. Ik zie ook nergens iets als autoloading ( http://php.net/manual/en/language.oop5.autoload.php ). Dat kan wel erg handig zijn voor lazy loading van objecten. Hoe wil je in de controller zo framework functionaliteit gaan aanroepen? $this->classname->method() vind ik zelf een fijne manier hiervoor.
Omdat PHP in een ander process wordt uitgevoerd, kan de server geen invloed hebben op het interpreteren van de PHP code/uitvoeren.
Correct me if I'm wrong, maar Windows IIS werkt prima met een forward slash hoor! Dus zoals ik het zie zijn zowel de defines voor de DS (directory seperator) als de defines voor bestandsextenties totaal overbodig. Precies wat Kees zegt. Die benchmark 1x uitvoeren terwijl je alleen al in dit ene bestand 20 paden op die manier opbouwt klopt natuurlijk niet. En als je bij iedere actie denkt... acht die paar milliseconden... dan heb je aan het eind van je framework ineens een halve seconde tijdsverschil opgebouwd. Lijkt me niet zinvol.
Die tweede constructor ga ik er uit halen en een MVC pattern ga ik er zeker in implementeren.
Edit:
Voor het aanmaken van nieuwe classes moet je echt een autoloader maken. Waarom doe je met de includes zo moeilijk? Ja kan toch ook gewoon je include path veranderen?
Misschien vind je hier jouw antwoord...
http://www.phphulp.nl/php/forum/topic/discussie-eigen-cms-of-niet/78551/
Een autoloader is niet om nieuwe classen te laden. En als ik een autoloader gebruik voor includes, gaan programmeurs slordig worden oa bestanden niet meer includen.
Ik heb er voor gekozen om een nieuw framework te maken, omdat je hier veel meer van leert, dan dat je een framework zoals Zend gebruikt.
Moet het niet zijn getObject? Maar wat voor nut heeft deze functie? Denk je zelf dat hij heel veel gebruikt gaat worden?
Daarnaast, in heel methode ontbreken controles of bijvoorbeeld: De file bestaat, de class bestaat, de methode bestaat.. Etc
Voor de basis van een MVC framework zou je misschien deze tutorial kunnen volgen? klik
Voor de rest ziet het er wel leuk uit!
Wat ook wel een mooi Framework is, één van onze bezoekers in het volgende: klik.. Er is ook nog een topic over: klik
Veel succes, goed op weg!
Niels In object.php zie ik de methode toString? Waarom? Gewoon echo van het object is toch prima? Dat vind ik overkill ;) Daar kan je jezelf beter druk om maken dat het bovenstaande denk ik .. Of niet?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
define('PHP_SUFFIX', '.php');
define('INI_SUFFIX', '.ini');
// Define the directory seperator.
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(__FILE__) . DS . '..');
define('CORE_FOLDER', ROOT . DS . 'core');
define('CORE_LIBRARY_FOLDER', CORE_FOLDER . DS . 'lib');
define('CLASSES_FOLDER', ROOT . DS . 'classes' . DS);
define('DATA_FOLDER', ROOT . DS . 'data');
define('CONFIGURATION_FILE', DATA_FOLDER . DS . 'configuration' . INI_SUFFIX);
define('CORE_LOG_FILE', CORE_FOLDER . DS . '..' . DS . 'data' . DS . 'logs' . DS . 'core.log');
define('ERROR_HANDLING_METHOD', "CoreErrorHandler::onError");
define('EXCEPTION_HANDLING_METHOD', "CoreErrorHandler::onException");
define('SHUTDOWN_HANDLING_METHOD', "CoreErrorHandler::onShutdown");
define('DEBUG', 2);
// Here we import the core classes.
include(CORE_FOLDER . DS . 'CoreConfigurationLoader' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreState' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreLogger' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreException' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreLibraryLoader' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CorePharCreator' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
?>
define('PHP_SUFFIX', '.php');
define('INI_SUFFIX', '.ini');
// Define the directory seperator.
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(__FILE__) . DS . '..');
define('CORE_FOLDER', ROOT . DS . 'core');
define('CORE_LIBRARY_FOLDER', CORE_FOLDER . DS . 'lib');
define('CLASSES_FOLDER', ROOT . DS . 'classes' . DS);
define('DATA_FOLDER', ROOT . DS . 'data');
define('CONFIGURATION_FILE', DATA_FOLDER . DS . 'configuration' . INI_SUFFIX);
define('CORE_LOG_FILE', CORE_FOLDER . DS . '..' . DS . 'data' . DS . 'logs' . DS . 'core.log');
define('ERROR_HANDLING_METHOD', "CoreErrorHandler::onError");
define('EXCEPTION_HANDLING_METHOD', "CoreErrorHandler::onException");
define('SHUTDOWN_HANDLING_METHOD', "CoreErrorHandler::onShutdown");
define('DEBUG', 2);
// Here we import the core classes.
include(CORE_FOLDER . DS . 'CoreConfigurationLoader' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreState' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreLogger' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreException' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreLibraryLoader' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CorePharCreator' . PHP_SUFFIX);
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
?>
Het ziet er op zich netjes uit, maar wat ik me dus afvraag... waarom DEFINE je een PHP_SUFFIX, een INI_SUFFIX en een DS(directory separator)?
Dat verandert toch nooit? Is dat dan geen overkill? Vervolgens ga je uit al die defines je include-paden opbouwen wat volgens mij niet ten goede komt aan je performance.
Dit:
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
kun je toch gewoon vervangen door:
include CORE_FOLDER . '/CoreErrorHandler.php';
Beter toch?
Ten tweede heb ik wat benchmarks gedaan en:
Zonder Constants: Took 0.00025105476379395 miliseconds
Met Constants: Took 0.00065803527832031 miliseconds
Code 1:
Code (php)
Code (php)
Dit schilt echter zo weinig dat ik me er niet ga over ontfermen.
Gewijzigd op 11/08/2011 00:24:39 door Fabian M
"Ten eerste, inderdaad, de PHP_SUFFIX verandert nooit, en daarom is het een constant (constantly variable)"
Ik ben gewoon benieuwd waarom je een bestandsextensie in een define stopt. Misschien zie ik het verkeerd, maar het komt op mij over alsof je het jezelf onnodig moeilijk maakt. Weet je wat laat ik eens in plaats van .php overal PHP_SUFFIX gaan typen. Die .php zal toch nooit anders worden... dat is eigenlijk wat ik bedoel.
Ik ben benieuwd hoe andere members hier tegenaan kijken...
Ben het helemaal met je eens. Verder vind ik elk mogelijk tijdverschil toch niet onverstandig om is over na te denken. Je moet enigszins de keuze maken tussen snelheid (performance) en gemak. In dit geval denk ik dat op beide punten kan winnen, weg met onnodige constanten en dan volgt het twee ook. Time is money!
(typo)
Gewijzigd op 11/08/2011 01:06:38 door Write Down
Gelukkig iemand die mijn mening deelt :)
Ozzie PHP op 10/08/2011 22:37:08:
Dit:
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
kun je toch gewoon vervangen door:
include CORE_FOLDER . '/CoreErrorHandler.php';
Beter toch?
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
kun je toch gewoon vervangen door:
include CORE_FOLDER . '/CoreErrorHandler.php';
Beter toch?
Nee. Windows gebruikt '\' en Unix systemen '/'. Als je je framework op IIS wilt zetten dan hoef je enkel DS aan te passen als je het op de manier van Fabian doet.
Write Down op 11/08/2011 01:06:11:
@Ozzie
Ben het helemaal met je eens. Verder vind ik elk mogelijk tijdverschil toch niet onverstandig om is over na te denken.
Ben het helemaal met je eens. Verder vind ik elk mogelijk tijdverschil toch niet onverstandig om is over na te denken.
Als je het verstandig vind om rekening te gaan houden met een performancewinst van vier tienduizenste van een milliseconde dan ben je naar mijn inzien verkeerd bezig. Het is veel belangrijker om op een goede manier te coden en je script goed onderhoudbaar, portabel e.d. te maken. PHP performance optimalisatie is iets waar alleen de grote websites op het web zich druk om hoeven te maken. Veel belangrijker is om je content te comprimeren, gzippen, enzovoorts. Dat kan je een paar seconden laadtijd schelen.
Edit:
Mijn feedback over het framework: het is nog erg in opbouw. Wat ik zie ziet er opzich goed uit. In de class Object viel me het volgende op:
Code (php)
Dit lijkt me een beetje dubbel en ik zie er het voordeel niet van in. Een class die van Object overerft kan toch met parent::__construct(); deze aanroepen. Of wil je als het object al bestaat nogmaals construct() kunnen aanroepen?
MVC zou ik er echt gaan inbouwen. Ik zie ook nergens iets als autoloading ( http://php.net/manual/en/language.oop5.autoload.php ). Dat kan wel erg handig zijn voor lazy loading van objecten. Hoe wil je in de controller zo framework functionaliteit gaan aanroepen? $this->classname->method() vind ik zelf een fijne manier hiervoor.
Gewijzigd op 11/08/2011 10:39:02 door The Force
Ben het met The Force eens.
Die benchmark slaat natuurlijk ook nergens op, je kunt niet met zekerheid stellen dat deze geldig is omdat de server op dat moment niet even met een ander proces bezig was. Het is beter om dezelfde test 1000x uit te voeren bijvoorbeeld per methode en dat te benchmarken.
Kees Schepers op 11/08/2011 10:38:49:
Die benchmark slaat natuurlijk ook nergens op, je kunt niet met zekerheid stellen dat deze geldig is omdat de server op dat moment niet even met een ander proces bezig was. Het is beter om dezelfde test 1000x uit te voeren bijvoorbeeld per methode en dat te benchmarken.
Omdat PHP in een ander process wordt uitgevoerd, kan de server geen invloed hebben op het interpreteren van de PHP code/uitvoeren.
The Force op 11/08/2011 10:22:25:
Nee. Windows gebruikt '\' en Unix systemen '/'. Als je je framework op IIS wilt zetten dan hoef je enkel DS aan te passen als je het op de manier van Fabian doet.
Ozzie PHP op 10/08/2011 22:37:08:
Dit:
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
kun je toch gewoon vervangen door:
include CORE_FOLDER . '/CoreErrorHandler.php';
Beter toch?
include(CORE_FOLDER . DS . 'CoreErrorHandler' . PHP_SUFFIX);
kun je toch gewoon vervangen door:
include CORE_FOLDER . '/CoreErrorHandler.php';
Beter toch?
Nee. Windows gebruikt '\' en Unix systemen '/'. Als je je framework op IIS wilt zetten dan hoef je enkel DS aan te passen als je het op de manier van Fabian doet.
Correct me if I'm wrong, maar Windows IIS werkt prima met een forward slash hoor! Dus zoals ik het zie zijn zowel de defines voor de DS (directory seperator) als de defines voor bestandsextenties totaal overbodig.
The Force op 11/08/2011 10:22:25:
Edit:
Mijn feedback over het framework: het is nog erg in opbouw. Wat ik zie ziet er opzich goed uit. In de class Object viel me het volgende op:
Dit lijkt me een beetje dubbel en ik zie er het voordeel niet van in. Een class die van Object overerft kan toch met parent::__construct(); deze aanroepen. Of wil je als het object al bestaat nogmaals construct() kunnen aanroepen?
MVC zou ik er echt gaan inbouwen. Ik zie ook nergens iets als autoloading ( http://php.net/manual/en/language.oop5.autoload.php ). Dat kan wel erg handig zijn voor lazy loading van objecten. Hoe wil je in de controller zo framework functionaliteit gaan aanroepen? $this->classname->method() vind ik zelf een fijne manier hiervoor.
Mijn feedback over het framework: het is nog erg in opbouw. Wat ik zie ziet er opzich goed uit. In de class Object viel me het volgende op:
Code (php)
Dit lijkt me een beetje dubbel en ik zie er het voordeel niet van in. Een class die van Object overerft kan toch met parent::__construct(); deze aanroepen. Of wil je als het object al bestaat nogmaals construct() kunnen aanroepen?
MVC zou ik er echt gaan inbouwen. Ik zie ook nergens iets als autoloading ( http://php.net/manual/en/language.oop5.autoload.php ). Dat kan wel erg handig zijn voor lazy loading van objecten. Hoe wil je in de controller zo framework functionaliteit gaan aanroepen? $this->classname->method() vind ik zelf een fijne manier hiervoor.
Die tweede constructor ga ik er uit halen en een MVC pattern ga ik er zeker in implementeren.
Heb een simpel MVC pattern geimplementeerd.
Edit:
Voor het aanmaken van nieuwe classes moet je echt een autoloader maken.
Waarom wordt er hier eigenlijk voor gekozen om een eigen framework te bouwen en niet een CMS op een bestaand framework bijvoorbeeld?
Kees Schepers op 15/08/2011 12:46:36:
Waarom wordt er hier eigenlijk voor gekozen om een eigen framework te bouwen en niet een CMS op een bestaand framework bijvoorbeeld?
Misschien vind je hier jouw antwoord...
http://www.phphulp.nl/php/forum/topic/discussie-eigen-cms-of-niet/78551/
Mwah die discussie gaat meer over of je zelf een CMS wilt bouwen of niet. Die keuze zou ik ergens nog kunnen begrijpen maar om ook meteen het hele framework eronder ook te gaan bouwen van ik erg ambitieus en onzin als je een goed systeem wilt bouwen.
Allard Jansen op 15/08/2011 12:35:16:
Waarom doe je met de includes zo moeilijk? Ja kan toch ook gewoon je include path veranderen?
Edit:
Voor het aanmaken van nieuwe classes moet je echt een autoloader maken.
Edit:
Voor het aanmaken van nieuwe classes moet je echt een autoloader maken.
Een autoloader is niet om nieuwe classen te laden. En als ik een autoloader gebruik voor includes, gaan programmeurs slordig worden oa bestanden niet meer includen.
Kees Schepers op 15/08/2011 12:46:36:
Waarom wordt er hier eigenlijk voor gekozen om een eigen framework te bouwen en niet een CMS op een bestaand framework bijvoorbeeld?
Ik heb er voor gekozen om een nieuw framework te maken, omdat je hier veel meer van leert, dan dat je een framework zoals Zend gebruikt.
Hmm oke in dat geval begrijp ik de keuze wel :) Succes ermee!
Moet het niet zijn getObject? Maar wat voor nut heeft deze functie? Denk je zelf dat hij heel veel gebruikt gaat worden?
Daarnaast, in heel methode ontbreken controles of bijvoorbeeld: De file bestaat, de class bestaat, de methode bestaat.. Etc
Voor de basis van een MVC framework zou je misschien deze tutorial kunnen volgen? klik
Voor de rest ziet het er wel leuk uit!
Wat ook wel een mooi Framework is, één van onze bezoekers in het volgende: klik.. Er is ook nog een topic over: klik
Veel succes, goed op weg!
Niels
Gewijzigd op 15/08/2011 18:59:27 door Niels K