提问人:Aaron 提问时间:3/17/2011 更新时间:3/17/2011 访问量:5979
PHP类扩展不起作用,为什么,这是如何正确扩展类?
PHP class extends not working why and is this how to correctly extend a class?
问:
嗨,所以我正在尝试使用面向对象编程来了解 inherteince 如何在 PHP 中工作。主类是 Computer,继承的类是 Mouse。我正在使用 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;
答:
而不是:
$pc = 新计算机('PC', 'Y');
你想要
$mouse = 新鼠标('PC', 'Y');
目前你有它,所以鼠标扩展计算机。
评论
它不是那样工作的。如果你创建一个,你就会得到它。你想创建一个计算机类型的东西(尽管这对我来说似乎很奇怪)。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 ...
}
}
仅执行实例化类的方法。如果它在子类中找不到方法,则它会在链中查找方法。即。如果类有“movemouse”,而你的子类没有,它将在父类中执行该类。computer
movemouse
这不是继承的工作方式。
继承(又名)允许您根据子类的父类的属性和方法扩展子类。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;
}
}
您现在可以扩展该类,因为 a 是 Peripheral。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
因此,虽然我可以做到这一点:
$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.
评论
当前的 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');
我还建议使用布尔值(true/false)而不是“Y”
评论
if($this->hasmouse)
评论