Реализация методов класса PHP

410
10 февраля 2017, 06:25

Я имею следующие классы:

<?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 может получать данные с его помощью, но я не знаю как это реализовать.

Answer 1

Вроде всё просто:

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 - класс-коллекция, у них не иерархическая связь, а композиционная.

Answer 2

Вы пытаетесь применить полиморфизм методов, который в PHP не поддерживается. Даже в C++ чтобы красиво всё работало - надо объявить методы виртуальными, а в PHP таких слов нету. Нечто похожее на полиморфизм может быть реализовано через интерфейсы - в вашем случае например:

interface DataShowinist {
    public function showData();
}

Затем у каждого класса

class Person extends Academy implements DataShowinist {
  ...

И наконец:

public function addPerson(DataShowinist $obj, $key = null) {
  ...
  $obj.showData();
} 

Но таблицы виртуальных методов в PHP нет, соответственно иерархии классов создавать тоже нет никакого интереса.

READ ALSO
Сборка geoip.so для hhvm 3.17

Сборка geoip.so для hhvm 3.17

В процессе сборки расширения geoipso для hhvm 3

288
Проблема в подключении стилей в теме wordpress

Проблема в подключении стилей в теме wordpress

Не получается подключить стилиВ файле index

391
Работа с датой время [требует правки]

Работа с датой время [требует правки]

В бд хранится дат время в таком формате 1486983600187Как мне получить читабельный? PHP

318
Правильное подключение PDO

Правильное подключение PDO

Есть подключение к БД:

415