嗨,所以我试图理解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;
答案 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!";
}
}
现在,因为Mouse
是Peripheral
的子类,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'