Указывать не объект, а его интерфейс. В данном случае там три метода - getId, toString и __construct. Этого будет достаточно для начала.
P.S.
По-хорошему ещё надо избавляться от id, т.к. это поле относится к реализации, а не к логике. Все полученные посты из какого-либо стораджа будут его иметь, а новосозданным постам знать о его существовании не обязательно. Т.е. примерно так должно получиться:
interface Post
{
public function __construct(string $content, User $user);
public function getContent() : string;
public function getUser() : User;
public function changeAuthor(User $user);
}
class WallPost implements Post
{
... implement methods
}
В таком случае у любых постов будет лишь автор и содержание, а остальное уже тонкости реализации, т.к. id нужен лишь для БД, что бы связать юзера с постом.
Но это всё уже немного другая история (см. предметно-ориентированное программирование).
P.P.S. На счёт сеттеров я бы поспорил. Предлагаю посмотреть вот эту
https://habrahabr.ru/post/279919/#comment_8816651 ветку комментариев, где Сергей мне доступно объяснил по поводу их нужности и я вынужден с этим согласиться, ибо иммутабельность данных - это хорошо.