Получение данных из композиции объекта

#php #object

#php #объект

Вопрос:

Допустим, у меня есть 3 объекта: «Место», «Человек», «Действие».

В зависимости от места, где находится человек, и возраста этого человека, этот человек может выполнять разные действия.

Например :

 $place->person->action->drive(); // OK if place is "parking" and "person" is 18 
$place->person->action->learn(); // OK if the place is "school" and person is less than 18.
  

Как я могу получить доступ к данным об объектах «Person» и «Place» из класса Action?

Примеры классов :

 class Place {
    public $person;
    private $name;

    function __construct($place, $person) {
        $this->name = $place;
        $this->person = $person;
    }

}

class Person {
    public $action;
    private $name;
    private $age;

    function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
        $this->action = new Action();
    }
}

class Action {
    public function drive() {
        // How can I access the person's Age ?
        // How can I acess the place Name ?
    }

    public function learn() {
        // ... Same problem.
    }
}
  

Я думаю, что я мог бы передать «$ this» от Person к Action при создании объекта Action (т.Е. $this->action = новое действие($this)), но как насчет данных о месте?

Ответ №1:

Не имеет смысла делать Person свойством Place, а действие — свойством Person.

Я был бы более склонен создавать общедоступные получатели для свойств Person и Place и либо делать их вводимыми свойствами Action, либо, по крайней мере, передавать их в качестве аргументов методам Action, например

 class Place
{
    private $name;

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

    public function getName()
    {
        return $this->name;
    }
}

class Person
{
    private $name;
    private $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getAge()
    {
        return $this->age();
    }
}

class Action
{
    private $person;
    private $place;

    public function __constuct(Person $person, Place $place)
    {
        $this->person = $person;
        $this->place = $place;
    }

    public function drive()
    {
        if ($this->person->getAge() < 18) {
            throw new Exception('Too young to drive!');
        }

        if ($this->place->getName() != 'parking') {
            throw new Exception("Not parking, can't drive!");
        }

        // start driving
    }
}