Ще предложа различен подход, въпреки че това е малко по-стар въпрос. Вместо да правите два обекта, трябва да направите три.
Създайте FileMetadata, който съдържа име, mimetype и т.н. Създайте FileContent, който съдържа съдържанието. След това създайте файл на трети обект, който поддържа връзка едно към едно с един от всеки от другите типове, и му дайте набор от методи, които просто извикват съвпадащите методи на подсъектите.
Така например във File методът setName би изглеждал така:
public function setName() {
$this->getFileMetadata()->getName();
}
И наборът ще изглежда така:
public function setName( $name ) {
$this->getFileMetadata()->setName( $name );
}
Конструкторът на обекта File трябва да създаде нов FileMetadata и нов FileContent при създаването и НЕ трябва да има метод setFilemetadata или setFilecontent; тези два обекта трябва да бъдат напълно защитени от вашето приложение.
Сега имате обекта File, който работи точно както искате (един обект, без допълнителни под-обекти), който все още се съхранява спретнато в две (добре, три наистина) различни таблици.