Toon posts:

[PHP] Gemoduleerd Code & Ouput opbouwen?

Pagina: 1
Acties:
  • 138 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig met het proberen een 'framework' te maken om sites gebaseerd op PHP gemoduleerd op te bouwen.

Bijvoorbeeld:

Ik heb een module genaamd Forum, daarin heb ik een module ViewTopics. In deze module, die een uitbreiding is op Forum, komt een lijstje met topics (duh). Nou wil ik daaraan iets toevoegen door een andere module, bijv een New Thread knopje. Dus ik maak een module NewThread, en daarin prop ik wat code, en ik stop via een RegEx en wat string functies een plaatje met daarin een linkje in de tabel van de lijst met topics.

Dit is te doen

nu komt een ander probleem:


stel ik voeg een module Permissies toe, waarmee ik zaken kan afschermen. Nu moet ik dus niet de output wijzigen, maar ik moet de code ook nog op een bepaald punt 'stopzetten'. Dit is dus het probleem, aangezien ik de module Permissies alleen wil maken, en niet ook de module ViewTopics hoeven te wijzigen. Ik wil dus zowel mijn output als mijn code kunnen regelen met modules, zonder dat ik de bovenliggende modules daarvoor hoef aan te passen.

Ik zat zelf te denken aan de eval() functie, of misschien OO, maar hoe precies weet ik niet. Eigenlijk moet een module zijn parent(s) kunnen aanpassen en functionaliteiten, code, output kunnen toevoegen EN aanpassen.

De meeste PHP gemoduleerde dingen die voegen dmv van modules functionaliteiten toe, en ik wil juist dmv modules ook functionaliteiten kunnen wijzigen. En daarop loop ik steeds vast.

Verwijderd

Op dinsdag 11 juni 2002 20:20 schreef K-Mile het volgende:
Eigenlijk moet een module zijn parent(s) kunnen aanpassen en functionaliteiten, code, output kunnen toevoegen EN aanpassen.
Da's een goeie. Volgens mij mag dat niet.

Verwijderd

ik heb het niet direct over OO (jij denk ik wel?), maar dit is wat ik WIL :) dus hoe ook, dat maakt mij niet uit.

edit: argh, ik haat het als het pasword onthouden wordt van de vorige user als jij een post maakt, dit was dus K-Mile...

Verwijderd

Topicstarter
Op dinsdag 11 juni 2002 20:28 schreef robh het volgende:

[..]

Da's een goeie. Volgens mij mag dat niet.
En hoezo mag het niet? in welke context? OO?

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Output fixen kan je wel met ob_* doen, maar volgens mij kan de rest niet.

Rustacean


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Je kan het beste gaan werken met een aantal 'core' classes, die vereist worden voor je modules, bijvoorbeeld een database, template en een user class voor user- en rechtenbeheer. Elke module laat je die core gebruiken, zodat elke module weet wat de rechten op een bepaald moment zijn.

zie ook dit topic:
[topic=513723/1/25]

Verwijderd

Ik weet niet in welke grootte jij dat forum gaat opzetten, maar ik ben zelf ook ooit met zoiets bezig geweest. Bleef langer vastzitten met 1 enkele module en zag later door de bomen het bos niet meer.

Is lastig om te bouwen, maar zou het resultaat graag zien !

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

K-Mile:
Ik ben bezig met het proberen een 'framework' te maken om sites gebaseerd op PHP gemoduleerd op te bouwen.
wat bedoel je met 'module'?

Is dat een object? Is dat een object-boom? Is dat een php-bestandje met functies? Of noem je 't alleen maar zo, en is het eigenlijk alleen maar een verzamling bestanden :?

Kun je dat een beetje toelichten? :)

edit: sorry Tizzwat ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Op dinsdag 11 juni 2002 23:22 schreef drm het volgende:
wat bedoel je met 'module'?

Is dat een object? Is dat een object-boom? Is dat een php-bestandje met functies? Of noem je 't alleen maar zo, en is het eigenlijk alleen maar een verzamling bestanden :?

Kun je dat een beetje toelichten? :)
Bedoel je mij ?

Verwijderd

Topicstarter
sorrie, was idd verwarrend:

een module bij mij ziet er als volgt uit: het is een bestandje met daarin een aantal declaraties (naam, auteur, versie, titel, etc) maar ook welke andere module hij achter hangt, of welke module hij uitbreid (er zijn voorlopig 2 types, een compleet nieuwe output (pagina), of de bestaande output verbouwen)

en er moet een index.php in de map van de module zitten, en in die index.php kunnen weer verwijzingen naar andere php documenten komen.

ik voeg dus in de map met modules een mapje toe, daarin een index.mod met declaraties, en een index.php met code, en evt plaatjes, andere code etc. En mijn framework indexeert die automatisch, en gebruikt de juiste modules voor de huidige module die nu geladen is. Dus hij pakt alleen de modules die er direct achter hangen als een linkje, of die de huidige module aanpassen.

ik ben er zelf ook nog niet helemaal uit, maar zoiets moet het worden.

edit: ff voorbeeld van hoe ik nu simpel de modules beheer:

Module Forum:
code:
1
2
3
4
Name: "Forum"
ID: forum
Title: "Gathering of Tweakers"
Extends: base

en een php documentje dat alle fora laat zien, en alle topics in de subfora.

Nu wil ik topics gepost kunnen laten worden, dus...

Module Addtopic:
code:
1
2
3
Name: "Add Topic"
ID: addtopic
Modifies: base.forum

Nu wil ik dat deze de lijst met topics van linkjes voorziet, en tevens een plaatje in de hoek met Add Topic erin. MAAR OOK: dat als hij aangeroepen wordt met een topicID, dat van module Forum alleen het bovenste stuk HTML, dus bij GoT Henk, en alle linkjes, maar daaronder een textbox voor het topic, en als daar op submit geklikt wordt en dezelfde module wordt aangeroepen met de inhoud van de post, moet alles toegevoegd worden in de dbase.

en zo zijn er nog wel een zooi modules te bedenken, die dus de bestaande code moeten uitbreiden of aanpassen.

Graasgast: tnx, dat was wel nuttig.

Enkele problemen die ik tegenkom: Ik kan niet zomaar classes gaan overschrijven, want als ik 2 modules heb die beide dezelfde class willen wijzigen.
Ook kan ik wel een aantal basis classes maken, en alles zoveel mogelijk in classes op te delen dat de code makkelijk op te bouwen is. maar dan nog kan ik niet halverwege een class wijzigingen aanbrengen.

Ik denk dat het OO icm Eval() gaat worden. Ik puzzel wel even door, maar als iemand nog een suggestie heeft over hoe dit makkelijk op te lossen is, graag.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

K-Mile:
Ik denk dat het OO icm Eval() gaat worden.
OMG, die 2 woorden in 1 zin, en dan ook nog met icm ertussen!!! :o :D licht ik zo toe ;)
Ik puzzel wel even door, maar als iemand nog een suggestie heeft over hoe dit makkelijk op te lossen is, graag.
Ik denk dat je een paar dingen een beetje uit het oog verliest.

Ten eerste: eval is uit den boze. Waarom? Omdat het in alle en ik zeg alle gevallen een allerlaatste redmiddel is. Waarom? Omdat het altijd mooier kan. Wat is mooier? Leesbaarder, maar vooral: beter onderhoudbaar, dus beter uitbreidbaar, dus: meer modulair ;)

Goed, wat OO betreft heb je wel een goede te pakken. Je zou inderdaad het beste een Module als Object kunnen zien.

Maar hoe bouw ik dan modulair een forum?
Ga vooral na wat je modules moeten zijn, willen ze zo min mogelijk verstrengeld zijn met anderen.

Ga bijvoorbeeld maar na: wat moet is het grootste aandeel van een forum (in code gesproken)? Juist, het managen, c.q. onderhouden een database (je forum).

Dus wat moet het forum doen? Queries. Aan de database. Omdat je namelijk of input wilt verwerken, of output wilt opvragen. Maar die output is geen output in de zin van voor de browser leesbare output, maar voor een output-verwerkende module. Dit, omdat je dan, als je iets in de verwerking van de output wilt veranderen je nooit wat aan je forum zelf hoeft te veranderen, maar alleen maar aan de output-module. Een andere kant is dat je die output-module ook aan andersoortige modules kunt hangen (een CMS?) en de outputverwerking een onafhankelijk gedeelte blijft van je php.

Maar daarnaast heb je een database die niet alleen door het forum gebruikt gaat worden. De database is dus geen eigenschap van het forum, maar een andere module. Oftewel, het forum mag een verwijzing naar de database bevatten, maar niet de database zelf. Bedenk bijvoorbeeld maar eens hoe vreemd het eigenlijk is dat je je forum moet aanpassen wanneer je migreert van de ene database naar de andere. Of wanneer je een andere username en passwoord krijgt op een andere server...

Tada, modulair.

Vervolgens moet je dus gaan bedenken 'welke eigenschappen mag het object hebben?'
Laten we als voorbeeld het forum aanhouden.

Nou, de eerste 2 hadden we al te pakken. Een verwijzing naar een output module, en een verwijzing naar een databasemodule. Andere voorbeelden zijn bijvoorbeeld een verwijzing naar een user-module (een module die bijhoudt welke user is ingelogd etcetera). Als je wat nodig hebt uit de database, vraag je het aan de databasemodule, als je wat info nodig hebt over de user, vraag je het aan de databasemodule, als je output hebt, die verwerkt moet worden, vertel je dat aan de output module, etcetera.

Nu zal je hoogstwaarschijnlijk denken: Ja, maar het de eerste eigenschappen waar je aan denkt zijn toch topics, posts, etcetera :?

Je moet dan niet vergeten dat posts en topics pure gegevens zijn. De forum-module is een module om die gegevens te bewerken en uit te lezen, niet om perse om te bevatten. Oftewel: de forum-module is een layer die de interface legt tussen je data (users en topics, etcetera), je database dus, en je output. Je forum-module verwerkt de data uit de datasource op zo'n manier, dat de output module er mee overweg kan.

Nou, ik hou er even mee op. Ik hoop dat je het een beetje volgt. Vragen staat uiteraard vrij ;)

HTH :)

zoethoudertje:
Je kunt zelfs zo ver gaan dat je de modules naar een nog abstracter niveau brengt. Oftewel, de forum module hoeft niet meer per se een verwijzing naar een database te bevatten, maar een verwijzing naar een datasource die vragen gesteld kan worden en resultsets teruggeeft. Je komt dan op OO interfaces terecht. (wat php in helaas redelijk slecht te realiseren is)
Bijvoorbeeld een class Database die een class Datasource implementeert (een implementatie is van...), en daarvan de methods functioneel invult: select, update etc.

Op die manier kun je namelijk zo ver gaan, dat je, los van wat er in het forum gebeurt, een datasource ontwikkelt, die gebaseerd is op bijvoorbeeld XML in plaats van op MySQL. maar da's misschien te veel van het goeie ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Thanx, bevat idd een paar goeie punten.

Maar teveel van het goede kan in dit geval nooit, want de strekking van mijn systeem gaat worden: als je het kan coden als module, dan is het toepasbaar. Dus als die XML datasource een output weergeeft waar je bovenliggende module iets mee kan, prima...

Het forum is nl puur als voorbeeld genogmen omdat iedereen wel weet hoe een forum ong werkt.

Wat ook mogelijk moet zijn is om in een laagste laag :+ een module Website toe te voegen, die uit de database een menu+paginas haalt, en het is een modulaire website. Nou moet iemand anders die die module gezien heeft, en weet hoe de module website werkt, zonder dat hij die module zelf aan hoeft te passen een module CMS kunnen maken, die aan de module Website wordt toegevoegd. Et voila, het is een website met CMS.

En als iemand de module CMS uitbreid met een XML datasource die dus (dit is dus weer het probleem waar ik mee zit) die module zo aanpast, zonder dus het document aan te passen, dat de data die gebruikt wordt geen mySQL meer is, maar XML. Dus dat ie zijn data niet van zijn eigen ingebouwde datasource pakt, maar van XML. En dit zonder dat de auteur van module CMS hier ook maar rekening mee heeft gehouden.

Dus ik denk wel dat dit te doen is door classes te overschrijven, maar dan ben je altijd gebonden aan het feit dat hij maar 1 keer overschreven kan worden. Als er twee modules erin aanpassingen maken, dan levert dat dus een conflict op.

Misschien een automatisch gegenereerde admin, waarin je classes in en uit kan schakelen, maar hoe dit code-technisch te realiseren valt.. :? en stel dat beide classes nuttige toevoegingen hebben op de class waar ze op 'van toepassing' zijn... :7 je kan het zo moeilijk maken als je wilt, maar ik vrees dat dit op geen andere manier kan als met ... eval() ...

desnoods door het inlezen van PHP documenten als strings en die vervolgens met RegExps en andere wazige functies verbouwen...


Voorbeeld van wat mogelijk moet zijn, heeel simpel gezegd:
PHP:
1
<?// Stel module base.blaat maakt deze class aan:class module   // Module base.blaat{   // Code van base.blaat hier}// Nu maat module base.blaat.hoi deze toevoeging aan de class:class module   // Module base.blaat.hoi{   // Code van base.blaat hier   // Code van base.blaat.hoi hier{// Nu komt er nog een module: base.blaat.doei:class module   // Module base.blaat.doei{   // Code van base.blaat.doei hier   // Code van base.blaat hier}// Nu moet dit de uitgevoerde class zijn:class module   // Module base.blaat.*{   // Code van base.blaat.doei hier   // Code van base.blaat hier   // Code van base.blaat.hoi hier}?>

Dat moet toch haast met Eval() ??

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

[PHP] Gemoduleerd Code & Ouput opbouwen?!?!?!
1 vraagteken is genoeg denk ik zo :{

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Laat ik je een tipje geven:

Als je een baseclass definieert en daar vervolgens een subclass van wil maken, gebruik je het magische woordje 'extends' in PHP

rtfm ;)

voorbeeldje is bijvoorbeeld in jouw geval
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Base
{
   function joepie () { echo "blaat"; }
}

class BaseBlaat extends Base
{

}

$c = new BaseBlaat ();
// woei: let maar eens op :D
$c->joepie ();

snappie?
__________________________________________________________________
edit:

Zat me nog te bedenken, dat je niet als een gek alles subclasses van elkaar moet maken. Je moet wat dat betreft goed nadenken over welke classes echt een parent-class + extra properties/methods zijn of alleen maar nodig hebben. Da's een redelijk essentieel verschil.

Als je zo'n idee gaat implementeren dat je datasources gaat abstraheren, dan zou je dat bijvoorbeeld zo kunnen zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class DataSource 
{
   //
}

class Database extends DataSource
{

}

class MySQL extends Database
{

}

Een instantie van Database vormt dan gelijk een implementatie van een datasource.
Vervolgens is MySQL op zijn beurt weer een implementatie van Database etcetera.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Martin Sturm
  • Registratie: December 1999
  • Laatst online: 01-09 16:14
Dit laatste kan volgens mij niet in de huidige PHP versies. Volgens mij kan je maximaal 1x subclassen.

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Op woensdag 12 juni 2002 13:32 schreef Martin Sturm het volgende:
Dit laatste kan volgens mij niet in de huidige PHP versies. Volgens mij kan je maximaal 1x subclassen.
nope. je kan in principe oneindig extenden

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

Op woensdag 12 juni 2002 13:41 schreef GraasGast het volgende:

[..]

nope. je kan in principe oneindig extenden
het enige wat in PHP niet kan is het extenden uit 2 classes (bv. een class 'topic' wat uit zowel 'forum' als 'rechten' bestaat bv.)

Klaar voor een nieuwe uitdaging.


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Op woensdag 12 juni 2002 13:43 schreef chem het volgende:

[..]

het enige wat in PHP niet kan is het extenden uit 2 classes (bv. een class 'topic' wat uit zowel 'forum' als 'rechten' bestaat bv.)
hoe hoe je dat dan in andere talen? (syntactisch gezien)

class foo extends bar, bla {} oid?

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

Op woensdag 12 juni 2002 13:51 schreef GraasGast het volgende:

[..]

hoe hoe je dat dan in andere talen? (syntactisch gezien)

class foo extends bar, bla {} oid?
volgens mij wel ja, het kan in Java wel meen ik...

"multiple inheritance " heet het...

Klaar voor een nieuwe uitdaging.


Verwijderd

Topicstarter
Inderdaad, vele andere talen ondersteuen wel Multiple Inheritance. (jammer genoeg C# niet, ben ik nu aan het doen want PHP is ook maar 1 van de opties)

Ik was in mijn voorbeeldje niet duidelijk genoeg, ik weet dat je inderdaad op die manier overerving kan toepassen, MAAR:
PHP:
1
<?// De eerste module:class hoi{   function joepie ()   {      echo "Hoi ";   }}// En de tweede module:class hoi{   function joepie ()   {      echo "Doei ";   }?>

moet als output als ik de functie hoi.joepie() aanroep: "Hoi Doei" gaan geven, ik wil dus op dit niveau kunnen aanpassen.

Verwijderd

Denk dat zoiets niet gaat lukken, je verwijst immers naar hetzelfde object die door 2 klasses gemaakt kan zijn. PHP zal nar mijn weten niet zien van welke klasse hij de constructor moet zijn (heerlijk krom)

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

2x de class hoi gaat zeker niet lukken, maar wat je zou kunnen doen class2hoi.joepie() is:
PHP:
1
<?parent::joepie();echo "Doei ";?>

Klaar voor een nieuwe uitdaging.


Verwijderd

Topicstarter
maar dit zal wel mogelijk zijn met Eval() ?!?

en ik begin maar eens met het aanpassen van losse classes, dus dat de methodes allemaal intact blijven, volgens mij moet ik dan al een heel end komen.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

:{ zucht, waarom geloof je nou niet dat je dat niet met eval moet doen |:(

Probeer het nou eerst eens door een goede objectboom te maken.

Als je dan vervolgens vanuit de ene method een method uit andere scope (een parent of zijn parent) aanwilt roepen doe je dat als volgt:
PHP:
1
<?class A {   function joepie () { echo "blaat in ``A''\n"; }}class B extends A {}{   function joepie () { A::joepie (); echo "blaat in ``B''\n"; }}class C extends B {   function joepie () { B::joepie (); echo "blaat in ``C''\n"; }}class D extends B {   function joepie () { A::joepie (); B::joepie(); echo "blaat in ``D''\n"; }}echo "<pre>C:\n";$c = new C ();$c->joepie ();echo "D:\n";$d = new D ();$d->joepie ();echo "</pre>";?>

Kijk daar eens naar...
chem:
volgens mij wel ja, het kan in Java wel meen ik...

"multiple inheritance " heet het...
In java werkt het net even anders. Dan kun je alleen multiple inheriten van interfaces (abstracte classes)

dat werkt zo:
code:
1
2
3
4
public class MyClass extends BaseClass implements Interface1, Interface2, Interface3
{
   // vervolgens implementeer je hier de inhoud van de interfaces.
}

Je geeft met een implements interface aan dat een class "tot iets in staat zal zijn", zoals het in de interface zelf is aangegeven. De interface bevat dus enkel een beschrijving van een bepaald "soort" object in plaats van de code.

In C++ heb je inderdaad "echte" multiple inheritance, en ook interfaces. Ze heten daar alleen virtual classes, en zijn niet zo duidelijk gescheiden met gewone classes als in Java.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

ik neem aan dat je kan kijken of een module aanwezig is.
doe dan gewoon in de forumindex module een sjek:
code:
1
2
3
if ($authmodule eq "ja") {
//voer de code uit die bij de auth module hoort
}

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Foxboy:
ik neem aan dat je kan kijken of een module aanwezig is.
doe dan gewoon in de forumindex module een sjek:
code:
1
2
3
if ($authmodule eq "ja") {
//voer de code uit die bij de auth module hoort
}
ook dat is van een andere orde

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
drm: ik hoor dat die functies zo niet kunnen, dus daarom d8 ik met eval() wel, maar dat van jouw dat werkt idd ook wel zo, en dat wist ik niet :) thanx...

en ik kom steeds een stukkie verder, niet alles wat ik wil is mogelijk, maar ik denk dat ik mijn idee toch voor 90% wel klaar krijg...

mocht ik verder komen dan zal ik (of webskipper dies er ook mee bezig) wel ff een update posten.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

K-Mile:
drm: ik hoor dat die functies zo niet kunnen, dus daarom d8 ik met eval() wel
eval zit alleen in php voor de luie coders. en eval is imo not done.
, maar dat van jouw dat werkt idd ook wel zo, en dat wist ik niet :) thanx...
np :)
en ik kom steeds een stukkie verder, niet alles wat ik wil is mogelijk, maar ik denk dat ik mijn idee toch voor 90% wel klaar krijg...

mocht ik verder komen dan zal ik (of webskipper dies er ook mee bezig) wel ff een update posten.
Hou ons op de hoogte. Ik vind het iig leuk :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Net nog ff brainstorm + UML diagrammetje gemaakt, en het gaat voor 99% lukken wat de bedoeling is.

dat helpt echt, zo'n UML diagram zodat je ff je classes en relaties enzo kan aangeven. kan ik iedereen die iets OO gaat programeren aanbevelen.

alleen jammer dat visio halverwege ophield, maar ff herschrijven in een ander modeleer prog en dan nog 100% abstract, en dan kan het naar code omgezet worden.

Het wordt dus modulair framework, waarbij alles een module is, en elke module 100% gerecycled kan worden voor gebruik in andere modules, en je kan dus met 100 man aan hetzelfde site werken zolang iedereen zich maar aan de standaardfuncties en regels van het framework houdt.

(en idd, maakt niet uit wat voor datasource of userdbase of wat dan ook aan hangt, kan allemaal :))

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

kan je dat ontwerp posten als het af is?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
sure...
Pagina: 1