Я имею следующие классы:
<?php
class Person extends Academy {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function ShowData() {
return ['name' => $this->name];
}
}
class Student extends Person {
public $education;
public function __construct($name, $education) {
parent::__construct($name);
$this->education = $education;
}
public function showData() {
return array_merge(parent::showData(), [
'education' => $this->education
]);
}
}
class Worker extends Person{
public $workPlace;
public function __construct($name, $workPlace) {
parent::__construct($name);
$this->workPlace = $workPlace;
}
public function showData() {
return array_merge(parent::showData(), [
'workPlace' => $this->workPlace
]);
}
}
?>
И их родительский класс:
<?php
class Academy {
private $items = array();
public function showAll($key) {
…
}
public function addPerson($obj, $key = null) {
…
}
}
?>
Мне необходимо реализовать методы showAll (показывает Name, Education и WorkPlace всех персон) и addPerson (добавляет новую персону в Academy). Я понимаю, что производные классы имеют метод showDate и метод showAll может получать данные с его помощью, но я не знаю как это реализовать.
Вроде всё просто:
class Academy {
private $items = array();
public function showAll() {
return array_map(function($person){
return $person->showData();
}, $this->items);
}
public function addPerson(Person $person) {
$this->items[] = $person;
}
}
И уберите extends Academy
из Person
. Это ни к чему.
Academy
- класс-коллекция, у них не иерархическая связь, а композиционная.
Вы пытаетесь применить полиморфизм методов, который в PHP не поддерживается. Даже в C++ чтобы красиво всё работало - надо объявить методы виртуальными, а в PHP таких слов нету. Нечто похожее на полиморфизм может быть реализовано через интерфейсы - в вашем случае например:
interface DataShowinist {
public function showData();
}
Затем у каждого класса
class Person extends Academy implements DataShowinist {
...
И наконец:
public function addPerson(DataShowinist $obj, $key = null) {
...
$obj.showData();
}
Но таблицы виртуальных методов в PHP нет, соответственно иерархии классов создавать тоже нет никакого интереса.
Виртуальный выделенный сервер (VDS) становится отличным выбором
В бд хранится дат время в таком формате 1486983600187Как мне получить читабельный? PHP