PHP class extends не работает почему и это как правильно расширить класс?
Привет, я пытаюсь понять, как inherteince работает в PHP с использованием объектно-ориентированного программирования. Основной класс-компьютер, наследующий класс-мышь. Я расширяю компьютерный класс с помощью класса мыши. Я использую __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 ответов:
Это работает не совсем так. Если вы создадите
Родительский объект (компьютер) понятия не имеет, что у него есть дочерний объект (мышь). Это происходит потому, что родительский класс может иметь несколько потомков.new Computer, вы получите именно это. Вы хотите создатьnew Mouse(), который является компьютером типа (хотя это кажется мне странным наследием).Как правило, у вас будет что-то вроде Apple extending computer или dell extending computer, тогда у вас будет
$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класс в родителе.
Так наследование не работает.
Наследование (он же
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, поскольку aMouseявляется периферийным.Теперь, поскольку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.
Вместо:
$pc = новый компьютер ('PC', 'Y');
Вы хотите
$mouse = Новая Мышь ('PC', 'Y');
В настоящее время у вас есть это так мышь расширяет компьютер.
Текущий конструктор мыши будет принимать только одно значение. Если вы хотите, чтобы мышь принимала как $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'
Comments