调用非对象的成员函数

时间:2012-08-25 16:37:22

标签: php

我正在考虑使用PHP并且遇到这个烦人的事情。

我正在尝试构建一个不同类型的灯泡和灯泡的模型,我想除了在C:\中的非对象上调用致命错误“调用成员函数zapal()”之外,一切都差不多了。第9行的xampp \ htdocs \ 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)?

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

1 个答案:

答案 0 :(得分:3)

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

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

更新Lampa(和所有其他类)以使构造函数类似于:

public function __construct (Zarowka $zarowka) {
    ....