1) Желательно.
2) В отдельном классе.
3) Можно по-разному сделать. Я бы для удобства сделал как-то так:
class AvatarManager
{
}
class User
{
private $avatarManager;
protected function getAvatarManager()
{
// здесь можно устроить и честный dependency injection, если планируется писать
// честные модульные тесты или есть подозрения, что менеджеров будет не один
return $this->avatarManager === null ? new AvatarManager($this) : $this->avatarManager;
}
public function getAvatarUrl($width, $height)
{
return $this->getAvatarManager()->getUrl($width, $height);
}
}