Gå til innhold

[LØST] Lage objekter på en dynamisk måte


Anbefalte innlegg

(Det var vanskelig å finne en tittel som beskriver problemet skikkelig...)

 

Fra før vet jeg at man kan lage variabler med navn fra andre variabler:

$foo = "bar";
${$foo} = "goo";

// skriver "goo"
echo $bar;

Kan man bruke en lignende prosedyre for å for eksempel gjøre:

class foo_class {
 var $foo;
 function __construct() {
   $this->foo = "goo";
 }
 function show() {
   echo $this->foo;
 }
}

class bar_class {
 var $foo;
 function __construct() {
   $this->foo = "gee";
 }
 function show() {
   echo $this->foo;
 }
}

$class = $_GET['class'];

// nå skulle jeg ønske at man kunne gjøre slik, men det kan man jo ikke:
$object = new {$class}_class;

// viser "goo" hvis $class er "foo", viser "gee" hvis $class er "bar".
$object->show();

Jeg klarer ikke å finne ut hvordan man skal gjøre dette... Hvis noen kunne ha kastet lys over saken hadde det vært supert! :)

Endret av Kick1
Lenke til kommentar
Videoannonse
Annonse

Går det an å gjøre det med et eval()-kall, for eksempel?

 

EDIT: Never mind. Fant ut at man kan gjøre

$class = $_GET['class']."_class";
$object = new $class;

:roll: Det var ikke verre.

Endret av Kick1
Lenke til kommentar

Vel, om du ikke må lag et objekt ut av det, og det er greit at metodene blir kalt uten referanse, kan du bruke denne:

$class = $_GET['class'];
call_user_func(array($class, 'show'));

Husk å implementere en eller annen sjekk før klassen blir kalt.

 

Et annet alternativ må vel være å bruke eval, sjøl om jeg sterkt fraråder dette i de fleste tilfeller.

 

edit: ALT for treig ;)

Endret av dabear
Lenke til kommentar
(Det var vanskelig å finne en tittel som beskriver problemet skikkelig...)

 

Fra før vet jeg at man kan lage variabler med navn fra andre variabler:

$foo = "bar";
${$foo} = "goo";

// skriver "goo"
echo $bar;

Kan man bruke en lignende prosedyre for å for eksempel gjøre:

class foo_class {
 var $foo;
 function __construct() {
   $this->foo = "goo";
 }
 function show() {
   echo $this->foo;
 }
}

class bar_class {
 var $foo;
 function __construct() {
   $this->foo = "gee";
 }
 function show() {
   echo $this->foo;
 }
}

$class = $_GET['class'];

// nå skulle jeg ønske at man kunne gjøre slik, men det kan man jo ikke:
$object = new {$class}_class;

// viser "goo" hvis $class er "foo", viser "gee" hvis $class er "bar".
$object->show();

Jeg klarer ikke å finne ut hvordan man skal gjøre dette... Hvis noen kunne ha kastet lys over saken hadde det vært supert! :)

5931561[/snapback]

 

Jeg vet det ikke var spørsmålet ditt, men jeg har en liten kommentar.

Koden din er en blanding av php4 og php5, det vil si du bruker var $foo og __construct. I php5 (som tydligvis serveren din har, ellers ville den klikket på __construct) bruker man innkapsling istedet for var. Du kan også bruke arv, for å slippe å skrive så mye kode.

 

Eksempelvis kan klassene dine skrives slik:

<?php 
class Foo_class {
protected $foo;
public function __construct() {
  $this->foo = "goo";
}
public function show() {
  echo $this->foo;
}
}

class Bar_class extends Foo_class{
public function __construct() {
  $this->foo = "gee";
}
}

$class = $_GET['class']."_class";
$object = new $class;
$object->show();
?>

 

Sånn hvis du har tenkt å leke med php5 er dette gode tanker å ta med.

Lenke til kommentar

Ja, se der ja!

Takk for tips og råd.

 

Har php4 på pc'en min, og php5 på webserveren jeg kjører på, så ikke rart jeg blir litt forvirra :blush:

Det med arv ser slett ikke dumt ut, det må jeg lære meg.

(og så må jeg få oppdatert til php5 :whistle:)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...