1

私はオブジェクト指向PHPに頭を悩ませており、この厄介なことに悩まされています。

さまざまな種類のランプと電球のモデルを作成しようとしていますが、致命的なエラー「C:\ xampp \ htdocsの非オブジェクトでメンバー関数zapal()を呼び出す」という事実を除けば、すべてがほぼ問題ないと思います。 9行目の\excersises\ oo \ lampki.php "

これがコードで、その後の私の考え方ですので、間違っているところを訂正してください

<?php
class Lampa {
  protected $zarowka;
  public function _construct (Zarowka $zarowka) {
    echo 'Wkrecam .arówke<br>';
    $this->zarowka = $zarowka;
  }
  public function zapal() {
    $this->zarowka->zapal();
    echo 'Lampka zapalona<br>';
  }
  public function zgas() {
    $this->zarowka->zgas();
    echo 'Lampka zgaszona<br>';
  }
}

class SciemniaczZarowki {
  private $zarowka;
  private $poziomJasnosci = 100;
  public function _construct (Zarowka $zarowka) {
    $this->zarowka = $zarowka;
  }
  public function rozjasnij() {
    if ($this->poziomJasnosci < 100) {
      $this->poziomJasnosci++;
      echo 'Rozjasniam swiatlo zarowki<br>';
    }
  }
  public function sciemnij() {
    if ($this->poziomJasnosci > 1) {
      $this->poziomJasnosci--;
      echo 'Przyciemniam swiatlo zarowki<br>';
    }
  }
}

class LampkaNocna extends Lampa{
    private $sciemniacz;


         public function _construct (Zarowka $zarowka) {
             parent::_construct($zarowka);

        $this->sciemniaczZarowki = new SciemniaczZarowki($this->zarowka);
  }
  public function rozjasnij() {
    $this->sciemniaczZarowki-> rozjasnij();
  }
  public function sciemnij() {
    $this->sciemniaczZarowki-> sciemnij();
  }
}

// Dodane przez mnie
class Zarowka{
    public $kolor;
    function __construct(){
        echo "Jam zarówka";
        $this->kolor = "biały";
    }
    private function zapal(){
        echo "zarówka: Świace!";
    }
    private function zgas(){
        echo "zarówka: Gasne!";
    }

}

$zarowka = new Zarowka();
$lampka = new LampkaNocna($zarowka);
$lampka->zapal();
$lampka->rozjasnij();
$lampka->sciemnij();
$lampka->sciemnij();
$lampka->rozjasnij();
$lampka->rozjasnij();
$lampka->rozjasnij();
$lampka->zgas();
?>

この表現は行番号を示していないので、部分に分けてみましょう。エラーの原因となる関数はLampaクラスにあります。

public function zapal() {
    $this->zarowka->zapal();
    echo 'Lampka zapalona<br>';
  }

私の考えはいつも、後でその行で呼び出すメソッドを持つZarowkaクラスがあるので、問題ないはずだと思っていました。新しいLampaオブジェクトを作成する前に、私はすでにオブジェクトZarowkaを持っているので、なぜそれが非オブジェクトの問題であると言うのですか(

$lampka = new LampkaNocna($zarowka);

私はそれをLampaに渡します)?

解決策は単純で簡単だと思いますが、私はこのコードを長い間見つめていました。答えて時間があれば、将来の読者がそれを利用できるように、考えを段階的に説明してください。

4

1 に答える 1

3

コード例では、コンストラクターの名前_construct()は で、先頭にアンダースコアが 1 つ付いています。

PHP では、正しいコンストラクタ名は__construct()、先頭に 2 つのアンダースコアが付いた です。つまり、コンストラクターが呼び出されることはありません。そのため、渡す変数は実際にはクラスに格納されません。

Lampa(および他のすべてのクラス) を更新して、次のようなコンストラクターを作成します。

public function __construct (Zarowka $zarowka) {
    ....
于 2012-08-25T16:40:33.523 に答える