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;
721   4  

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, поскольку a 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.

Вместо:

$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

    Ничего не найдено.