PHP-класс расширяет не работает, почему и как правильно расширить класс? - PullRequest
2 голосов
/ 17 марта 2011

Привет, поэтому я пытаюсь понять, как наследование работает в PHP, используя объектно-ориентированное программирование.Основным классом является Computer, наследуемый класс - Mouse.Я расширяю класс Computer с помощью мышки.Я использую __construct в каждом классе, когда я создаю класс, сначала я использую тип ПК, а после него мышь.По какой-то причине компьютер возвращает ноль?почему это?

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 ]

4 голосов
/ 17 марта 2011

Это не так, как работает наследование.

Наследование (он же 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, но не наоборот ...

Так что пока я могу это сделать:

$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.
3 голосов
/ 17 марта 2011

Это не совсем так.Если вы создадите new Computer, вы получите именно это.Вы хотите создать new Mouse(), который относится к типу computer (хотя мне это кажется странным бездействием).

Родительский объект (компьютер) понятия не имеет, что у него есть дочерний элемент (мышь).Это связано с тем, что у родительского класса может быть несколько детей.

Как правило, у вас будет что-то вроде компьютера, расширяющего яблоко, или компьютера, расширяющего Dell, тогда у вас будет

$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 голосов
/ 17 марта 2011

Вместо:

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

хочешь

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

В настоящее время она у вас есть, поэтому Mouse расширяет компьютер.

1 голос
/ 17 марта 2011

Ваш текущий конструктор Mouse будет принимать только одно значение. Если вы хотите, чтобы 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'

...