Avatar billede Droa Seniormester
27. oktober 2010 - 12:58 Der er 13 kommentarer og
1 løsning

objekt i object som skal have fat i parent objekt?

Jeg har en instance af en class, med en anden instance af en anden klasse.


class A
{
  protected $titel = "test"
  protected $dataTable = ""
  protected $childObject = new B()

  function Write()
  {
    $this->childObject->WriteDesign();
  }
  }

class B
  {
  function WriteDesign()
  {
    echo $base->title;
  }
  }



grunden til jeg gerne ville gøre sådan, er fordi class B er der jeg vil kunne gemme mit HTML design, og den måde den viser dataerne på.

men jeg kan ikke rigtigt få adgang til A objektet, jeg har startet B objektet i? burder man ikek kunne det?
Avatar billede majbom Novice
27. oktober 2010 - 13:21 #1
jeg ved ikke om man kan, men kan ikke se hvorfor ikke...

er det den eksakte kode du viser her? for der mangler nogle ; i enderne af nogle af dine linjer.

og det ser ud som om at du har begge klasser i samme fil?
Avatar billede Droa Seniormester
27. oktober 2010 - 13:36 #2
det var et eksempel.. min rigtige kode er 1400 linier lang, og bestående af kun en klasse indtilvidere.

men vis jeg kunne ligge "HTML-design" for sig selv i sin egen klasse.. f.eks navnet "defaultDesignClass"

hvor man stadig havde tilgang til hovedklassens variabler... så kunne man let erstatte "defaultDesignClass" med f.eks "customDesignClass" så hele HTML'en bliver ændret, uden at data manipulationen bliver ændret i ens hovedklasse
Avatar billede coderdk Praktikant
27. oktober 2010 - 13:47 #3
B har ikke adgang til A's properties - De skal dele arvemasse, hvis det skal lade sig gøre - Du skal extende ;)
Avatar billede coderdk Praktikant
27. oktober 2010 - 13:48 #4
Jeg vil anbefale dig at kigge på et godt MVC framework, såsom Kohana, Zend eller lignende :)
Avatar billede repox Seniormester
27. oktober 2010 - 13:51 #5
Der er så mange logiske/design fejl i OP's forslag/idé at jeg ikke kan se hvad målet er - altså, kan spørgsmålet ikke besvares ud fra beskrivelsen.
Avatar billede repox Seniormester
27. oktober 2010 - 13:53 #6
#3
Hvis han extender B med A, er det selvfølgelig en helt anden sag at tilgå hinandens metoder og medlemmer, men det giver ikke så meget i forhold til den oprindelige kode.
Avatar billede majbom Novice
27. oktober 2010 - 13:58 #7
tror det spørger mener er:

i klasse a opretter han en instans af klasse b og derefter vil han tilgå en metode i klasse b fra en metode i klasse a

ved ikke om det blev værre eller bedre :D
Avatar billede Droa Seniormester
27. oktober 2010 - 14:16 #8
det var lige det jeg mente :D

men jeg omgik det ved og lave et array i A, som jeg så sender en refrance på til B

class A
{
public $arrayc;
private $b;

function A()
{
  $this->b = new B($this->arrayc);
  $this->arrayc = array();
 
  $this->arrayc[0] = new C();
  $this->arrayc[0]->name = "test";
  $this->arrayc[0]->age = 23;
  $this->arrayc[1] = new C();
  $this->arrayc[1]->name = "test2";
  $this->arrayc[1]->age = 24;
  $this->arrayc[2] = new C();
  $this->arrayc[2]->name = "test3";
  $this->arrayc[2]->age = 29;
  $this->arrayc[3] = new C();
  $this->arrayc[3]->name = "test4";
  $this->arrayc[3]->age = 2;
}
}

class B
{
private $base;

function B($c)
{
  $this->base = $c;
}

function Write()
{
print_r($this->base);
}
}

class C
{
private $name;
private $age;
}



man kunne os gøre den mere specifik ved og lave C til en enkeltstående instance, eller måske en static, med de data jeg vile bære over i B.

jeg prøvede først med bare og give $this over i B med referance, men det er lidt noget rod, da jeg får både A og B på den måde.

så istedet bruge en C med kun de data jeg ville have
Avatar billede intenz Novice
27. oktober 2010 - 14:16 #9
Enig med den øvrige kritik.

Det du forsøger at lave ligner at B er en specialisering af A, så i stedet for du kalder A, bør B extende A, så den får adgang til A's metoder/properties, og du bør derfor arbejde med B.

Den mere praktiske måde at illustrere det på:
class A {
  protected $titel = "test"

  function Write()
  {
    $this->WriteDesign();
  }
}

class B extends A
  {
  function WriteDesign()
  {
    echo $this->title;
  }
}

// B har nu adgang til alle A's metoder og kan derfor bruge i stedet for A.
$b = new B();
$b->Write();
Avatar billede majbom Novice
27. oktober 2010 - 14:29 #10
-> intenz - har du ikke byttet lidt rundt på noget af det? A har ikke adgang til WriteDesign() - eller?
Avatar billede Droa Seniormester
27. oktober 2010 - 14:53 #11
jeg tror ikke Write har adgang på den måde, da den ligger i A.. og siden B extender A, kender A stadig ikke til WriteDesign();
Avatar billede intenz Novice
27. oktober 2010 - 15:35 #12
Nej, hvis du kalder A direkte, vil den ikke have adgang til WriteDesign().

$a = new A();
$a->WriteDesign(); // vil melde fejl.

Men hvis du bruger B, vil det virke fint. A har lige så meget adgang til B's metoder som B har til A's. I hvert fald så længe metode/property er enten public eller protected. Hvis den var private vil de ikke have adgang til hinandens.

Af samme grund bør A derfor være abstract, så den ikke kan kaldes direkte. Fordi den er afhængig af en specialicering, og derfor kun kan bruges til at extende specialicerede klasser (som f.eks. B).

Der er desuden et par småfejl i den oprindelige klasse, de er rettet herunder.

abstract class A {
  protected $title = "test";

  function Write()
  {
    $this->WriteDesign();
  }
}

class B extends A {
  function WriteDesign()
  {
    echo $this->title;
  }
}

// B har nu adgang til alle A's metoder og kan derfor bruge i stedet for A.
$b = new B();
$b->Write();

$a = new A(); // vil give fejl, da A er abstract. Vi forhindrer derfor at den kan kaldes direkte, da den skal bruge nogle af metoderne fra de specialicerede klasser.


Prøv at test det hvis i er i tvivl :)

Man kan så gå videre med at lave WriteDesign() en abstract metode i A, så specialicerede klasser (f.eks. B) _skal_ have en WriteDesign metode for at kunne extende A. Men en ting ad gangen.

Hvis du/i har behov for lidt baggrundsviden om OOP i PHP, kan denne bog kraftigt anbefales:
http://www.amazon.co.uk/Objects-Patterns-Practice-Experts-Source/dp/143022925X/ref=sr_1_1?ie=UTF8&s=books&qid=1288186404&sr=8-1
Avatar billede majbom Novice
27. oktober 2010 - 19:45 #13
jeg mente at hvis man laver en instans af a, så har du vel ikke adgang til writedesign? har man ikke kun det hvis du laver en instans af b og så kalder writedesign fra dén instans?
Avatar billede Droa Seniormester
28. oktober 2010 - 10:34 #14
så længe det virker, tror os jeg kan få det til og virke på en ordenlig måde, som det er nu.. tror bare jeg skal begynde og tænke mig lidt om. tak igen for alle de mange kommentarer, håbede bare der var en anden måde, så jeg kunne have mere end en Child i en parent
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