2008-09-15 5 views
2

Экземпляр класса А конкретизирует несколько других объектов, скажем, например, из класса B:Как получить доступ к переменным класса родительского объекта в PHP?

$foo = new B(); 

Я хотел бы получить доступ к переменным а в общественных класса методов в В.

Если я не что-то отсутствует, единственный способ сделать это, чтобы передать текущий объект экземпляров B:

$foo = new B($this); 

это лучшая практика или есть другой способ сделать это?

ответ

2

Это выглядит хорошо для меня, я имею тенденцию использовать эмпирическое правило: «Кто-нибудь, кто бы это понял, понял?» и это легко понимаемое решение.

Если есть только один «А», вы могли бы рассмотреть вопрос об использовании шаблона реестра см, например http://www.phppatterns.com/docs/design/the_registry

+0

спасибо. В моем конкретном случае действительно применяется шаблон реестра. (Класс A открывает несколько ссылок на базы данных и должен передавать информацию о конфигурации в B и другие классы.) – 2008-09-15 12:24:24

1

Я бы сначала проверил, не используете ли вы неправильный шаблон: из вашей логики приложения, должен ли B действительно знать об A? Если B должен знать об A, отношения между родителем и ребенком кажутся недостаточно адекватными. Например, A может быть дочерним, или часть логики А может перейти в третий объект, который находится ниже «B» в иерархии (то есть не знает о B).

Это означает, что у вас есть метод в B для регистрации A в качестве источника данных или для создания метода в A для регистрации B как Observer и метода сопоставления в B, который A использует для уведомления B значения изменения.

0

Подобно тому, что Павел сказал, что если есть только один А, вы можете осуществить это как синглтон. Затем вы можете передать экземпляр A в качестве аргумента для конструктора (агрегации), с помощью метода setter (по существу, агрегации), или вы можете установить это отношение непосредственно в конструкторе (композиции).

Однако, хотя синглеты являются мощными, будьте осторожны с их реализацией с композицией. Приятно думать, что вы можете сделать это так и избавиться от аргумента конструктора, но это также делает невозможным заменить A чем-то другим без перезаписи кода. Peronsally, я бы придерживаться агрегации, даже при использовании синглтона

$foo = new B(A::getInstance()); 
0
$foo = new B($this); 

код, как это, к сожалению, не соответствует моим потребностям. Есть ли другой способ доступа к свойствам родительского объекта?

Я попытаюсь объяснить, почему. Мы пишем игровое программное обеспечение, а некоторые классы имеют очень «необычные» зависимости и влияют друг на друга по-разному. Вот почему код иногда становится почти неподдерживаемым без ссылок на родителей в каждом случае (иногда даже несколько родителей из разных контекстов, т. Е. Отряд может принадлежать Битве и Пользователю и т. Д.).

И теперь причина, по которой ссылки меня не удовлетворяют. Когда я создаю вывод для клиентской стороны, я использую некие сериализующиеся объекты в XML. Он работает очень хорошо, пока не встретит рекурсивные ссылки, подобные этим ссылкам на родителей. Я могу защитить их, но потом они потеряют свое использование, т. Е.(Фиктивный пример)

$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...); 

Другого способа - реализовать метод сериализации в каждом сериализуемом классе и вызвать его в сериализаторе так:

$obj->toXML($node); 
$this->appendChild($node); 

, но это очень много вещей, чтобы написать и поддержать! И иногда я генерирую объекты для serializer динамически (меньше трафика).

Я даже думаю о взломе: «научить» сериализатора игнорировать некоторые свойства в определенной классне)). Huh ... плохая идея ...

Это долгая дискуссия, но поверьте мне, что Registry and Observer не подходит. Есть ли другие идеи?

Смежные вопросы