Avatar billede aggie Nybegynder
18. februar 2003 - 20:01 Der er 8 kommentarer

object 'parent' reference?

er det muligt ud fra:

class A {
  function A() {
      $this->id = "ydre objekt";
  }
}

class B {
  function sig_hej() {
      echo "hej til" . __ETELLERANDET__;
  }
}

$a = new A();
$a->indre_objekt = new B();

$a->sig_hej();

- at få $a til at lave output med en property fra $b, altså

/* output
hej til ydre objekt
*/
Avatar billede aggie Nybegynder
18. februar 2003 - 20:02 #1
ah - det jeg gerne vil have er en slags 'parent' reference, ikke direkte reference til variablen $b..
Avatar billede swaxi Nybegynder
18. februar 2003 - 21:17 #2
du mener ...

class A {
  function A() {
      $this->id = "ydre objekt";
  }
  function sig_hej() {
    $this->indre_objekt->sig_hej($this->id);
  }
}

class B {
  function sig_hej($etellerandet) {
      echo "hej til" . $etellerandet;
  }
}

$a = new A();
$a->indre_objekt = new B();

$a->sig_hej();
Avatar billede aggie Nybegynder
18. februar 2003 - 21:31 #3
nej, det er meningen det indre objekts skal kunne tilgå det ydre objekt's metoder og properties..
Avatar billede z42cool Nybegynder
19. februar 2003 - 08:52 #4
Hvis ikke du anvender arv, bliver du nødt til at anvende assosciering. I dit eksempel er det jo det ydre objekt a du gerne vil have til at tilgå det indre objekts b metode sig_hej og så skal det indre objekt b tilgå det ydre objekt a's property. Dette lan godt lade sig gøre ved hjælp af binær assosciering, men umiddelbart vil jeg tro der er en mere elegant løsning. Kan du ikke forklare hvad det er du vil opnå?

<?
class Outer
{
    var $id;

    function Outer($id)
    {
        $this->id = $id;
    }
}

class Inner
{
    var $owner;
   
    function Inner($owner)
    {
        $this->owner = $owner;
    }
   
    function do_something()
    {
        echo("Hello my parent is " . $this->owner->id);
    }
}

$o = new Outer("world");
$i = new Inner($o);

$i->do_something();
?>
Avatar billede aggie Nybegynder
19. februar 2003 - 12:00 #5
jeg har en data struktur der indeholder en hjemmeside,

class Page {
  function Page($uniq_id) {
      $this->id = $uniq_id();
  }
  function set_title($title) {
    $this->title = $title;
  }
  // etc etc for andre egenskaber, som forfatter,dato etc

  function add_paragraph($title,$text,$description,$author) {
      $this->paragraph[] = new Paragraph();
  }
  function import_template($template_text) {
    $this->template = $template_text);
  }
  function parse() {
      // løber template teksten igennem efter specielle tags, der udskiftes
      // med objektets egenskaber, eks. '<!-- #this:title# -->' bliver
      // udskiftet med $this->title
  }
}

class Paragraph {
  // ligner Page, bare andre properties
}

- så er det, at hvert enkelt underelement har sin egen parse() funktion, og sin egen template, men det skal gerne være muligt i Paragraph's template at referere til Page properties, og så skal parseren i et indre paragraph objekt kunne tilgå det ydre Page objekts properties..
Avatar billede z42cool Nybegynder
19. februar 2003 - 12:30 #6
Så bliver du nødt til at anvende assosciering som i mit ovenstående eksempel. Så skal du når du opretter objeketer der er underordnet et andet objekt sende en owner parameter med som du så gemmer i objeketet og som du så kan tilgå!
Avatar billede swaxi Nybegynder
19. februar 2003 - 17:21 #7
eler rettere ... lade det alle objekter have et array af children, som hver parse-metode kalder. (det syntes umiddelbart mest rationelt at bede Page om at rendere, og så forvente at den håndtere sine delelementer, som igen håndterer sine)
Avatar billede aggie Nybegynder
08. december 2003 - 22:25 #8
tak, du fik ret - det jeg endte med, der virkede, var at page->parse() hver gang den mødte et <!-- #paragraph:template# --> bad alle children om at parse en separat template og returnere det så det kunne indsættes. Simpelt når først man ser det :)

- kan du ikke lige svare etellerandet?
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