Какой способ передать данные Dynami c через родительский конструктор? - PullRequest
0 голосов
/ 25 марта 2020

Допустим, у меня есть ферма с различными животными. Когда появляются новые животные, я хочу приветствовать их. Я не хочу воссоздавать функцию приветствия для каждого животного, поэтому я делаю 1 и расширяю его до классов животных.

class Chicken
{
    public function __construct(ChickenCoop $chickenCoop)
    {
        $this->chickenCoop = $chickenCoop;
    }

    public function gate()
    {
        $this->chickenCoop->addChicken('Clara');
        $this->chickenCoop->addChicken('Paula');
        $this->chickenCoop->addChicken('Betty');
        echo $this->chickenCoop->welcomeAnimals();
    }
}

class ChickenCoop extends AnimalHousing
{
    private array $chickens = [];

    public function __construct()
    {
        parent::__construct($this->chickens);
    }

    public function addChicken(string $chicken)
    {
        $this->chickens[] = $chicken;
    }
}

class AnimalHousing
{
    private array $animals;

    public function __construct(array $animals)
    {
        $this->animals = $animals;
    }

    public function welcomeAnimals()
    {
        $body = "welcome ";

        foreach ($this->animals as $animal) {
            $body .= "{$animal} ,";
        }

        return $body;
    }
}

Проблема в том, что parent :: __ construct ($ this-> chickens); создает пустой массив для своего родителя. Как передать эти данные о курице в класс AnimalHousing?

1 Ответ

0 голосов
/ 25 марта 2020

То, что вы делаете, на самом деле не имеет большого смысла.

Зачем вам нужен массив "цыплят", отдельный от массива "животных" в родительском классе? Какой смысл в списке животных в этом случае? Это не может быть динамически обновлено. А поскольку $chickens - это просто список строк (а не какой-то более сложный тип, определяющий c для представления цыплят), он не добавляет никакого значения сверх списка $animals.

Было бы более целесообразно добавить addChicken в список «животных» в родительском классе, а не в отдельный список в дочернем классе.

Возможно, что-то подобное :

<?php
class Chicken
{
    public function __construct(ChickenCoop $chickenCoop)
    {
        $this->chickenCoop = $chickenCoop;
    }

    public function gate()
    {
        $this->chickenCoop->addChicken('Clara');
        $this->chickenCoop->addChicken('Paula');
        $this->chickenCoop->addChicken('Betty');
        echo $this->chickenCoop->welcomeAnimals();
    }
}

class ChickenCoop extends AnimalHousing
{
    public function __construct()
    {
        parent::__construct();
    }

    public function addChicken(string $chicken)
    {
        $this->animals[] = $chicken;
    }
}

class AnimalHousing
{
    protected $animals = [];

    public function __construct()
    {
    }

    public function welcomeAnimals()
    {
        $body = "welcome ";

        foreach ($this->animals as $animal) {
            $body .= "{$animal} ,";
        }

        return $body;
    }
}

$coop = new ChickenCoop();
$chick = new Chicken($coop);
$chick->gate();

Демонстрация: http://sandbox.onlinephpfunctions.com/code/37c101fc4861dacf64c417e3213869e20e6847a1

(В настоящее время технически наличие подкласса "Цыпленок Coop" на самом деле не добавляет любое значение вообще, так как вы могли бы просто иметь функцию «addAnimal» в родительском классе и вместо этого создать экземпляр AnimalHousing.Но я предполагаю, что вы, возможно, намереваетесь добавить больше функциональности c, определяемой по умолчанию, к классу в будущем, поэтому по этой причине я не буду рекомендовать удалить его полностью.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...