ООП - это много, чтобы защитить внутренние объекты от внешнего мира. То, что вы пытаетесь сделать здесь, это предоставить способ опубликовать внутренности phone
через интерфейс person
. Это не приятно.
Если вам нужен удобный способ получить «все» свойства, вы можете написать явный набор вспомогательных функций для этого, возможно, при желании обернутый в другой класс. Таким образом, вы можете развивать поддерживаемые утилиты, не затрагивая (и, возможно, не нарушая) основные структуры данных:
class conv {
static function phone( $person ) {
return $person->contact->phone;
}
}
// imagine getting a Person from db
$person = getpersonfromDB();
print conv::phone( $p );
Если вам когда-нибудь понадобится более специализированная функция, добавьте ее в утилиты. Это лучшее решение: отделить удобство от ядра, чтобы уменьшить сложность и повысить удобство обслуживания / понятность.
Другим способом является «расширение» класса Person
с помощью удобств, построенных на основе базового класса:
class ConvPerson extends Person {
function __construct( $person ) {
Person::__construct( $person->contact, $person->name, ... );
}
function phone() { return $this->contact->phone; }
}
// imagine getting a Person from db
$person = getpersonfromDB();
$p=new ConvPerson( $person );
print $p->phone();