2012-03-28 3 views
0

Ich bin neu in OOP, also bitte nicht hart sein.Warum funktioniert das nicht? OOP Novize

Meine Aufgabe ist es, dass diese:

$color = new Color(127,0,0); 
$rect = new Rectangle($color, 100, 50); 
$rect->render(); 

auf die Seite bringen sollte den folgenden Code:

"div style="background-color:RGB(127,0,0);width:100px;height:50px"></div>" 

Unten ist mein OOP-Code. Ziel war es, eine abstrakte Klasse Component und eine abstrakte Methode render() zu verwenden. Ich versuche, warum Code, um herauszufinden, funktioniert nicht:

class Color { 
    protected $red; 
    protected $green; 
    protected $blue; 
    public function __construct($red, $green, $blue) { 
    $this->red = $red; 
    $this->green = $green; 
    $this->blue = $blue; 
    } 
} 
    abstract class Component { 

    protected $color; 
    protected $width; 
    protected $height; 

    public function __construct($color) { 

    $this->color = new Color(); 

    } 

    abstract function render(); 

    } 
    class Rectangle extends Component { 
    public function __construct($color, $width, $height){ 
    parent::__construct(); 
    $this->color = $color; 
    $this->width = $width; 
    $this->height = $height; 
    } 
    public function render() { 
    echo "<div style='background-color:RGB(" . $this->color . ");width:" . $this->width .  "px;height:" . $this->height . "px'></div>"; 
    } 
    } 
    $color = new Color(127,0,0); 
    $rect = new Rectangle($color, 100, 50); 
    echo $rect->render(); 
+0

Sie müssen uns sagen (und verstehen, sich selbst!) * was * funktioniert nicht, bevor du zu * warum * gelangen kannst. Normalerweise führt dich der erste direkt zum zweiten. –

+0

Was scheitert? Haben Sie Fehlermeldungen aktiviert? Wird die Seite nicht vollständig geladen? –

+0

Warnung: Fehlendes Argument 1 für Component :: __ construct(), in/public_html/index.php in Zeile 26 aufgerufen und in/public_html/index.php in Zeile 18 definiert – Sorrybyenglish

Antwort

1

Wenn Sie $this->color Echo wollen, sollten Sie __toString Methode für Color Klasse definieren.

class Color { 
    protected $red; 
    protected $green; 
    protected $blue; 
    public function __construct($red, $green, $blue) { 
     $this->red = $red; 
     $this->green = $green; 
     $this->blue = $blue; 
    } 

    public function __toString() { 
     return "$this->red, $this->green, $this->blue"; 
    } 
} 

Und beachten Sie, dass ein Tippfehler in Ihrem Code ist, sollte withwidth sein.

Auch der Code in Rectangle::__construct Methode unter

parent::__construct(); 
$this->color = $color; 

sollte

parent::__construct($color); 

Und die Component Klasse sein sollte (die Änderung der __construct beachten):

abstract class Component { 

    protected $color; 
    protected $width; 
    protected $height; 

    public function __construct($color) { 

     $this->color = $color; 

    } 

    abstract function render(); 

    } 
+0

Oh danke. Das ist was ich will. Ich wurde verstanden, aber danke)) – Sorrybyenglish

+0

Ich tat mit do Breite. – Sorrybyenglish

+0

@Sorrybyenglish '"); mit: "', du willst 'Breite', oder? – xdazz

2

Sie haben das Objekt $color nicht an die Elternklasse übergeben, und die Schreibweise von width ist falsch

public function __construct($color, $width, $height){ 
    parent::__construct($color); //The parent also needs a $color as it is defined 
    $this->color = $color; 
    $this->width = $width; 
    $this->height = $height; 
} 
+0

Ich wusste es nicht)) Danke ... – Sorrybyenglish

+0

tat ich mit do Breite. – Sorrybyenglish

+0

@Sorrybyenglish, Yeah Überprüfen Sie die Schreibweise der Breite, während der gesamten Funktion. Siehe das Update – Starx