Objektorientert PHP Problem

En tråd i 'PHP, SQL og databaser' startet av JanMS, 4 Sep 2010.

  1. JanMS Medlem

    Innlegg:
    15
    Er det noen som er god på objektorientert PHP og som kan si meg hva som jeg gjør feil her. Hvorfor får jeg ingen utskrift når jeg kjører koden?

    Her er kode:
    PHP:
    $c = new C();
    $c->addB();
    $c->addA(0);
    $c->addAContent(00'test');
    $c->addB();
    $c->addA(1);
    $c->addAContent(01'test2');
    echo 
    $c->getString();
    Her er klasser:
    PHP:
    class {
        private 
    $cnr;
        private 
    $c;
        public function 
    __construct() {
            
    $this->= array();
            
    $this->cnr 0;
        }
        public function 
    addB() {
            
    $this->b[$this->bnr++] = new B();
        }
        public function 
    addA($bnr) {
            
    $this->b[$bnr]->addA();
        }
        public function 
    addAContent($bnr$anr$content) {
            
    $this->b[$bnr]->addAContent($anr$content);
        }
        public function 
    getString() {
            
    $data '';
            for (
    $i 0$i $this->bnr$i++) {
                
    $text $this->b[$i]->getString();
                
    $data .= $text;
            }
            
    $x = new X($data);
            return 
    $x->getString();
        }
    }
    class 
    {
        private 
    $anr;
        private 
    $a;
        public function 
    __construct() {
            
    $this->anr 0;
            
    $this->= array();
        }
        public function 
    addA() {
            
    $this->a[$this->anr++] = new A();
        }
        public function 
    addAContent($anr$content) {
            
    $this->a[$anr]->addContent($content);
        }
        public function 
    getString() {
            
    $data '';
            for (
    $i 0$i $this->anr$i++) {
                
    $data .= $this->a[$i]->getString();
            }
            
    $x = new X($data);
            return 
    $x->getString();
        }
    }
    class 
    A{
        private 
    $content;
        public function 
    __construct() {
            
    $this->content '';
        }
        public function 
    addContent($content) {
            
    $this->content $content;
        }
        public function 
    getString() {
            
    $x = new X($this->content);
            return 
    $x->getString();
        }
    }
    class 
    {
        private 
    $text;
        public function 
    __construct($text) {
            
    $this->text $text;
        }
        public function 
    getString() {
            return 
    $this->text;
        }
    }
     
  2. Thomas Pedersen

    Thomas Pedersen Pornogründer

    Innlegg:
    632
    Skal ikke private $c i class C egentlig være private $b?
     
  3. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    Ser ut som hjemmelekse for min del ?
     
  4. JanMS Medlem

    Innlegg:
    15
    Jo det stemmer det, var litt rask når jeg skrev dette...
     
  5. JanMS Medlem

    Innlegg:
    15
    Det skulle være private $b og også private $bnr i class C, men problemet ligger ikke der... Problemet ligger i at jeg ikke får utskrift fra getString... Det store spørsmålet er hvorfor ikke, hva gjør jeg feil?

    Det jeg kan tenke meg frem til at når den kommer til returnsetningen så gir den opp kontrollen til klassen som kalte den også kjøres garbage collector og sletter referansen til resultatet av getString()...

    Har prøvd også å lage en var i klassen får å holde på resultatet men uten hell...

    Trenger sårt hjelp med denne....
     
  6. tyr897

    tyr897 Medlem

    Innlegg:
    402
    Jeg forstår ikke hvorfor du har en addA() metode i C, kan du ikke bare hente ut B objektet fra C?

    Når det gjelder det spesifikke problemet ditt, rent bortsett fra at variabelnavnene er feil, tror jeg du har byttet om på parametrene.

    PHP:
    // *snip*..
    $c->addB(); 
    $c->addA(1); 
    $c->addAContent(01'test2');

    // addAContent
    public function addAContent($bnr$anr$content)
    Du la til en A=0 i B=1. Du prøver så å endre innholdet til A=1 i B=0 og det objektet eksisterer ikke.

    Jeg mener uansett du heller burde hente ut objektene og manipulere dem direkte: $c->getB(1)->getA(0)->addContent('test');
    Strukturen slik den er nå er veldig forvirrende.
     
  7. JanMS Medlem

    Innlegg:
    15
    Du har selvfølgelig rett. Jeg var litt trett når jeg laget denne testkoden for å spesifisere mitt problem. Ser at jeg har noen skrivefeil her og der, men det store problemet mitt er ikke å få satt verdiene, det store problemet mitt er å få UT verdiene da getString returnerer ingenting... Når jeg kjører echo på klassene så inneholder de verdiene de skal men de returnerer de ikke i getString funksjonen...
     
  8. JanMS Medlem

    Innlegg:
    15
    Reposter koden og klassene

    Reposter koden og klassene pga skrivefeil.

    Koden:

    PHP:
    $c = new C();
    $c->addB();
    $c->addA(0);
    $c->addAContent(00'test');
    $c->addB();
    $c->addA(1);
    $c->addAContent(10'test2');
    echo 
    $c->getString();  
    Klassene:

    PHP:
    class {
        private 
    $bnr;
        private 
    $b;
        public function 
    __construct() {
            
    $this->= array();
            
    $this->bnr 0;
        }
        public function 
    addB() {
            
    $this->b[$this->bnr++] = new B();
        }
        public function 
    addA($bnr) {
            
    $this->b[$bnr]->addA();
        }
        public function 
    addAContent($bnr$anr$content) {
            
    $this->b[$bnr]->addAContent($anr$content);
        }
        public function 
    getString() {
            
    $data '';
            for (
    $i 0$i $this->bnr$i++) {
                
    $text $this->b[$i]->getString();
                
    $data .= $text;
            }
            
    $x = new X($data);
            return 
    $x->getString();
        }
    }
    class 
    {
        private 
    $anr;
        private 
    $a;
        public function 
    __construct() {
            
    $this->anr 0;
            
    $this->= array();
        }
        public function 
    addA() {
            
    $this->a[$this->anr++] = new A();
        }
        public function 
    addAContent($anr$content) {
            
    $this->a[$anr]->addContent($content);
        }
        public function 
    getString() {
            
    $data '';
            for (
    $i 0$i $this->anr$i++) {
                
    $data .= $this->a[$i]->getString();
            }
            
    $x = new X($data);
            return 
    $x->getString();
        }
    }
    class 
    A{
        private 
    $content;
        public function 
    __construct() {
            
    $this->content '';
        }
        public function 
    addContent($content) {
            
    $this->content $content;
        }
        public function 
    getString() {
            
    $x = new X($this->content);
            return 
    $x->getString();
        }
    }
    class 
    {
        private 
    $text;
        public function 
    __construct($text) {
            
    $this->text $text;
        }
        public function 
    getString() {
            return 
    $this->text;
        }
    }  
     
  9. tyr897

    tyr897 Medlem

    Innlegg:
    402
    Tonny Kluften liker dette.
  10. JanMS Medlem

    Innlegg:
    15
    Men i alle dager ??? Det gjør den faktisk... Nå skjønner jeg hvertfall ikke hvor problemet mitt ligger for originalklassene gjør faktisk nøyaktig det samme som her men returnerer ingenting :confused:

    Urk... Har ikke lyst til å poste originalkoden...

    Okei, folkens, takk for all hjelp så langt :D
     
  11. JanMS Medlem

    Innlegg:
    15
    Vil bare si takk til alle dere som tok dere tid til å hjelpe meg med denne, feilen lå ett helt annet sted i programmet...

    *thumbsup*
     

Del denne siden