Objektorientert PHP Problem

JanMS

Medlem
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(0, 0, 'test');
$c->addB();
$c->addA(1);
$c->addAContent(0, 1, 'test2');
echo $c->getString();

Her er klasser:
PHP:
class C {
    private $cnr;
    private $c;
    public function __construct() {
        $this->c = 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 B {
    private $anr;
    private $a;
    public function __construct() {
        $this->anr = 0;
        $this->a = 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 X {
    private $text;
    public function __construct($text) {
        $this->text = $text;
    }
    public function getString() {
        return $this->text;
    }
}
 

JanMS

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

tyr897

Medlem
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(0, 1, '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.
 

JanMS

Medlem
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(0, 1, '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.

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

JanMS

Medlem
Reposter koden og klassene

Reposter koden og klassene pga skrivefeil.

Koden:

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

Klassene:

PHP:
class C {
    private $bnr;
    private $b;
    public function __construct() {
        $this->b = 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 B {
    private $anr;
    private $a;
    public function __construct() {
        $this->anr = 0;
        $this->a = 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 X {
    private $text;
    public function __construct($text) {
        $this->text = $text;
    }
    public function getString() {
        return $this->text;
    }
}
 

JanMS

Medlem
Hm, nå tok jeg og testet koden med endringer (PHP 5.3.3/Windows) - og den skriver ut "testtest2".

PHP | <?php class C { p - Anonymous - b3CzVqQT - Pastebin.com

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
 

JanMS

Medlem
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*
 
Topp