Gå til innhold

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


Anbefalte innlegg

Skrevet (endret)

(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
Videoannonse
Annonse
Skrevet

Altså sånt funker ikke "overall", men bare til funksjoner. Har slitt en god stund for å få den til å funke med arrayer, men ga opp. Man kan bare lage variabler ser det ut som.

Skrevet (endret)

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
Skrevet (endret)

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
Skrevet (endret)
Går det an å gjøre det med et eval()-kall, for eksempel?

5931698[/snapback]

Joa, men guuuuuud så stygt.

 

eval("\$object = new {$class}_class;");

 

Edit: Eller slik du gjorde det.

Endret av Ernie
Skrevet
(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.

Skrevet

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:)

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...