PHP类扩展不工作原因,这是如何正确扩展类?

时间:2011-03-17 00:07:20

标签: php oop inheritance extend

嗨,所以我试图理解inherteince如何在PHP中使用面向对象编程。主类是Computer,继承的类是Mouse。我正在使用鼠标类来扩展Computer类。我在每个类中使用__construct,当我在类中使用时,我首先使用pc类型,如果它之后有鼠标。出于某种原因,计算机返回null?这是为什么?

class Computer {
    protected $type = 'null';

    public function __construct($type) {
        $this->type = $type;
    }
    public function computertype() {
        $this->type = strtoupper($this->type);
        return $this->type;
    }

}

class Mouse extends Computer {
    protected $hasmouse = 'null';
    public function __construct($hasmouse){
         $this->hasmouse = $hasmouse;

    }
    public function computermouse() {
         if($this->hasmouse == 'Y') {
             return 'This Computer has a mouse';
         }
    }

}

$pc = new Computer('PC', 'Y');
echo $pc->computertype;
echo $pc->computermouse;

4 个答案:

答案 0 :(得分:4)

这不是继承的工作方式。

继承(又名extend)允许您根据父类的属性和方法扩展子类。

例如考虑以下内容:

class Peripheral {
  private $connectionType;
  private $isConnected = false;

  function __construct($connectionType) {
    $this->connectionType = $connectionType;
  }

  function getConnectionType() {
    return $this->connectionType;
  }

  function connect() {
    $this->isConnected = true;
  }

  function disconnect() {
    $this->isConnected = false;
  } 

  function isConnected() {
    return $this->isConnected;
  }
}

您现在可以扩展Peripheral课程,因为Mouse是外围设备。

class Mouse extends Peripheral {
  private $numOfButtons;

  function __construct($connectionType, $numberOfButtons) {
    parent::__construct($connectionType);
    $this->numOfButtons = $numOfButtons;
  }

  function getNumOfButtons() {
    return $this->numOfButtons;
  }

  function leftClick() {
    if($this->isConnected())
      echo "Click!";
  }

  function rightClick() {
    if($this->isConnected())
      echo "RightClick!";
  }
}

现在,因为MousePeripheral的子类,Peripheral中定义的所有方法都可以在Mouse中访问,但不是相反... < / p>

所以我可以这样做:

$mouse = new Mouse('USB', 2);
echo $mouse->getConnectionType(); // USB
$mouse->connect();
$mouse->leftClick();

我无法做到以下几点:

$perip = new Peripheral('USB');
echo $perip->getConnectionType(); // USB
$perip->connect();
$perip->leftClick(); // ERROR: leftClick not defined.

答案 1 :(得分:3)

它不是那样的。如果你创建一个new Computer,你就会得到它。你想创建一个类似计算机的new Mouse()(虽然这对我来说似乎很奇怪)。

父对象(计算机)不知道它有一个子(鼠标)。这是因为父类可以有多个子节点。

一般来说,你会有类似苹果扩展计算机的东西,或戴尔扩展计算机然后你有

$a = new apple();
$b = new dell();

他们都有可用的方法在计算机中定义,加上他们自己的方法。

此外,当您覆盖像__construct这样的方法时,如果要执行它,则必须显式调用父构造函数(或方法),例如:

class computer {
   function __construct() { do stuff }
}

class apple extends computer {
   function __construct() {
        parent::__construct();
        ... do stuff ...
    }
}

只有您实例化的类的方法才会被执行。如果它无法在子类中找到该方法,那么它会查找链的方法。即。如果computer类有'movemouse'并且你的子类没有,它将执行父类中的movemouse类。

答案 2 :(得分:2)

而不是:

$ pc = new computer('PC','Y');

你想要

$ mouse = new鼠标('PC','Y');

目前你有它,所以鼠标扩展计算机。

答案 3 :(得分:1)

您当前的鼠标构造函数只接受一个值。如果你想让Mouse同时接受$ type和$ hasmouse,那么你需要接受两个值。

class Mouse extends Computer {
    protected $hasmouse = 'null';
    public function __construct($type, $hasmouse) {
        parent::__construct($type);
        $this->hasmouse = $hasmouse;
    }
    public function computermouse() {
         if($this->hasmouse == 'Y') {
             return 'This Computer has a mouse';
         }
    }
}

$pc = new Mouse('PC', 'Y');

我还建议使用boolean(true / false)而不是'Y'