#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
}
}