Avatar billede alexander_j Nybegynder
02. november 2009 - 23:26 Der er 7 kommentarer og
1 løsning

dynamisk navngivning af class

Når jeg definere en class bruger jeg følgende kode:

include("classes/myClassName.php");
$myClass = new myClassName();

Jeg kunne nu godt tænke mig at hente class'ens navn fra en string. Se mit ikke fungerende eksempel:

$str = "myClassName";
include("classes/" . $str . ".php");
$myClass = new $str();

(Det er den sidste linje der er ikke fungerende)

Spørgsmålet er derfor: Hvordan kan jeg definere en class ud fra en string, hvor string'en indeholder navnet på class'en i tekstform?
Avatar billede arne_v Ekspert
02. november 2009 - 23:48 #1
Noget a la:

$factory = new ReflectionClass($str);
$o = $factory->newInstance(123, 'ABC');

men men men - jeg vil klart anbefale dig at vælge et andet design.
Avatar billede dkfire Nybegynder
02. november 2009 - 23:52 #2
Hvad siger php til din kode ?
Jeg har et par steder hvor jeg kan gøre præcis det du laver.
Avatar billede Slettet bruger
03. november 2009 - 00:14 #3
Hvad med eval ?

$str = "myClassName";
include("classes/" . $str . ".php");
$myClass = eval("return (new ".$str."());");

Jeg har nu også svært ved at se en situation hvor det giver mening...
- plugins måske ?
Avatar billede alexander_j Nybegynder
03. november 2009 - 08:22 #4
Hej Arne m.fl.

Jeg har ikke lige haft mulighed for at efterprøve jeres løsninger - det når jeg nok en gang i aften.

Jeg er lidt interesseret i hvorfor i ikke mener det giver mening eller hvorfor I vil anbefale et andet design.

Hver af mine sider defineres ud fra forskellige class'er, således nogle sider kan have samme class som udgangspunkt, men variere i detaljen ud fra forskellige variable, mens andre arbejder ud fra vidt forskellige class'es.

I en tabel i min database har jeg de forskellige menupunkter og dertil hørende sider defineret efter formen:
id | menupunktsnavn | sidens class

På den måde tænker jeg, at jeg kan nøjes med at kalde de enkelte sider ud fra deres id, og så derved henvise til den relevante class'e.

Vh/Alexander
Avatar billede alexander_j Nybegynder
03. november 2009 - 17:42 #5
Det var T4NK3R's løsning jeg har brugt.

Kom med svar de der vil have del i point!
Avatar billede Slettet bruger
03. november 2009 - 18:54 #6
Yes please : )

Jeg kan godt se din idé, nu. Det giver jo en helt enorm fleksibilitet.

Minder lidt om det dersens "grid-computing" - man hører om - eller Java's RPC

Måske for meget af det gode.. Risikerer du ikke at det hele "går op i limningen" ?
Avatar billede arne_v Ekspert
04. november 2009 - 02:00 #7
Hvis det kun laves en eller få gange per request fordi at det er en controller handling, så kan det godt bruges.

Jeg vil nok foreslå:
- kigge på et eksisterende MVC framework fremfor at genopfinde den dybe tallerken
- undlad at blande kode og HTML for meget (at have klasser med en masse echo i er ikke godt)
- eksportere menuer ved opdatering fremfor at generere dem dynamisk
Avatar billede alexander_j Nybegynder
04. november 2009 - 15:21 #8
MVC-framework ved jeg ikke lige hvad er, men vil forsøge at slå det op.

I mine class'er laver jeg "kun" strings med html-kode, som så returneres til hovedsiden, hvor echo kommer i funktion. Jeg echo'er aldrig direkte fra class'en!

Ved eksportere menuer, så tænker du fx, at jeg ved ændringer på siderne, lader dem generere en xml-fil med menuoplysningerne, og at det så er denne fil der bruges i dagligdagen til menuerne fremfor ved kald til databasen?
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