1

我正在考虑 oo PHP 并被这个烦人的事情所困扰。

我正在尝试构建不同类型的灯和灯泡的模型,我想除了致命错误“在 C:\xampp\htdocs 中的非对象上调用成员函数 zapal() \excersises\oo\lampki.php 在第 9 行"

这是代码,然后是我的思维方式,所以请纠正我哪里错了

<?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);

我把它传给兰帕)?

我敢打赌,解决方案简单易行,但我想我已经盯着这段代码太久了。如果您决定回答并有一些时间,请您可以逐步描述您的想法,以便未来的读者可以利用它。

4

1 回答 1

3

在您的示例代码中,您的构造函数命名为_construct(),并带有一个前导下划线。

在 PHP 中,正确的构造函数名称是__construct(),带有两个前导下划线。换句话说,你的构造函数永远不会被调用——所以你传递的变量实际上并没有存储在类中。

更新Lampa(和所有其他类)以具有类似于以下内容的构造函数:

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