Avatar billede fizk Nybegynder
18. juli 2008 - 10:01 Der er 3 kommentarer

Reflection i php?

Jeg sidder overfor at skulle lave et system, der skal kunne benytte sig af plugins der bliver dynamisk tilføjet.

Problemet er lidt at folk jo har alle mulige former for gode ideer om hvad de synes de skal kalde deres klasser (at inkludere filerne er ikke noget problem), så jeg tænkte på om der var en mulighed for at "læse" en .php fil for at finde ud af hvilke klasser den indeholder uden at skulle til at løbe den igennem som en plain-text fil og søge efter Class?

På forhånd tak
Avatar billede pidgeot Nybegynder
18. juli 2008 - 10:27 #1
Jeg er ikke bekendt med en måde du kan få at vide hvilke klasser der findes i en given fil, men hvis du kan få fat på navnene (eks. ved at stille et krav om at det skal matche filnavnet på en bestemt måde) kan du godt bruge reflection: http://dk2.php.net/manual/en/language.oop5.reflection.php

Jeg vil dog foreslå en lidt anden struktur til at lave det, baseret på et Observer pattern:

Start med et fælles plugin-bibliotek hvor du inkluderer alle filer. Disse filer skal så - idet de inkluderes (include_once/require_once er nok gode at bruge her) - registrere sig så op mod en kendt klasse der holder styr på hvilke funktioner der skal kaldes hvornår, ved at holde styr på en række collections. På den måde er det også de enkelte plug-ins der angiver hvornår de er relevante at bruge.

I dit system placerer du så på en række strategisk udvalgte steder (alt afhængigt af hvor plugins må gøre noget - det kommer jo lidt an på dit system) kald til en metode der kalder alle de funktioner der har registreret sig selv i forbindelse med den pågældende "event".

Afhængigt af dit behov kan det måske være en god ide at bruge interfaces til at angive metodesignaturer til klasser der skal koble sig på et bestemt sted.
Avatar billede fizk Nybegynder
18. juli 2008 - 11:19 #2
Interfaces er et must her, da jeg regner med at bruge noget reflection til metodekald (hvor der er restriktioner på hvornår de må kaldes). Jeg må indrømme at jeg ikke lige havde tænkt over Observer/Obserable, men det lyder faktisk til at være en super idé.

Grunden til at jeg gerne ville have læst alle klasser i en given fil, er at man godt kan risikere at der bliver lagt flere klasser i samme fil og at de ikke har samme måde at navngive filer på, så det kan godt give nogle problemer på dét område...
Avatar billede pidgeot Nybegynder
18. juli 2008 - 12:10 #3
Man kan jo sige du i bund og grund har tre måder at håndtere problemet med flere klasser i en fil:

1) Find klasserne og lav noget reflection med dem - det kommer nok til at tage en del tid at implementere, men du kan i og for sig tage mod lige hvad det skal være.
2) Lad plugin'et selv styre hvor den vil meldes til, på baggrund af Observer-princippet - det kan gøres med et par linjer kode udenfor klassen i PHP-filen (hvilket også gør at det er plugin-udvikleren der må tage stilling til hvor han vil "komme til").
3) Bestem at det ganske enkelt ikke understøttes på den måde, og sæt det op som et krav at den klasse der skal hentes noget fra ligger i en fil med et navn der på en eller anden måde (som du fastsætter) angiver hvad klassen hedder. Hvis en plugin-udvikler vil smide flere klasser i samme fil, så

Jeg ved af gode grunde ikke hvad der passer bedst til dit behov, men jeg ville nok foretrække 2) - jeg mener det giver mest mening at det er plugin-udvikleren der angiver hvor hans plugin har relevans.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester