Avatar billede lajer Nybegynder
22. januar 2004 - 17:12 Der er 9 kommentarer

Lav ny instans af class dynamisk ?

Hej!

Jeg har en række class' der alle sammen har samme argumenter i deres constructor.

Jeg vil gerne lave en ny instans af en af disse class' dynamisk. Noget i stil med:

$Obj = new $this->ObjectName . "('argument1', 'argument2')";

Ovenstående virker selvfølgelig ikke - men hvordan klares dette?

// Lajer
Avatar billede Slettet bruger
22. januar 2004 - 18:13 #1
Måske kan du bruge:

$class = get_class($this);
$Obj= new $class('argument1', 'argument2');

Eller måske endda

$Obj=new get_class($this)('argument1', 'argument2');

Men jeg anser nummer 2 som lidt iffy. Den første burde virke.
Avatar billede smirnoff Nybegynder
22. januar 2004 - 18:42 #2
Hvad peger $this på ?

så vidt jeg kan se er der ikke instantieret et object endnu - og $this vil være null
- og så kan man ikke benytte get_class() som jo skal have et objekt som parameter.

vær desuden opmærksom på get_class returnerer klassens navn i lowercase - så hvis du har en klasse med definitionen med uppercase kan du få problemer

f.eks

class Cart {
...
}

$cartobj = new Cart;

- vil med get_class($cartobj) returnere "cart"

kan du ikke hente klasserne ind i et array og gøre sådan her:

$klasser = array("klasse1", "klasse2", "klasse3");
for ...
$newobj = new $klasser[$i]($arg1, $arg2);
Avatar billede Slettet bruger
22. januar 2004 - 18:50 #3
smirnoff: $this peger altid på det objekt hvori $this bruges. Det gik jeg ud fra at lajer vidste, så jeg gik dermed også ud fra at meningen var at en metode i objektet skulle kunne lave et nyt objekt af samme klasse som det selv.

Ifølge brugerkommentarerne i php-maualen er det ikke et problem at get_class returnerer i lowercase. objektnavne er tilsyneladende ikke-case-sensitive.
Avatar billede smirnoff Nybegynder
22. januar 2004 - 18:58 #4
ved godt $this peger på objeketet selv - men spørgsmålet er også lidt tricky synes jeg .. så fair nok

ang case: du har ret - var jeg faktisk ikke klar over :)
Avatar billede Slettet bruger
22. januar 2004 - 19:05 #5
Jeg fandt såmænd også først ud af det lige før klokken 18:13:57 ;-) Men det overrasker mig ikke. PHPs indbyggede funktionsnavne er også ligeglade med case. Hvis du får lyst kan du sagtens skrive MySQL_Query($streng).
Avatar billede lajer Nybegynder
22. januar 2004 - 20:38 #6
Hej igen.

Jeg tror at i måske har misforstået mit spørgsmål.

Her er et eksempel på hvad det er jeg vil:

class a
{
  function a( $argument1, $argument2 )
  {
      echo "Jeg er blevet kaldt af klassen b's metode MakeInstance()";
  }
}
class b
{
  function MakeInstance( $aObjName )
  {
      $Obj = new $aObjName; // < Her at det går galt.
  }
}
$b = new b();
$b->MakeInstance("a");

Håber at I forstår hvad jeg mener nu.

Nb. kode frit skrevet... May be buggi ;)
Avatar billede smirnoff Nybegynder
22. januar 2004 - 21:36 #7
på hvilken måde går det galt -- hvad er fejlen? - for ovenstående virker ... hvis bare der føres nogle variable over i konstruktøren
Avatar billede smirnoff Nybegynder
22. januar 2004 - 21:40 #8
jeg prøvede at skirve det ind med en lille ændring:


class a
    {
      function a( $argument1, $argument2 )
      {
          echo "Jeg er blevet kaldt af klassen b's metode MakeInstance()";
      }
    }
    class b
    {
      function MakeInstance( $aObjName )
      {
          $Obj = new $aObjName(1, 2); // < Her at det går galt.
          print "<br>".get_class($Obj);
      }
    }
    $b = new b();
    $b->MakeInstance("a");

og print get_class($Obj) returnerer "a"
Avatar billede Slettet bruger
22. januar 2004 - 22:04 #9
Hvis den oprindelige kode er som vist, er problemet nok, at det nylavede objekt forsvinder igen, når funktionen afslutter. Det skal gemmes et sted - enten i objektet, der laver det eller det skal returneres.
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