Autor Zpráva
ninewi
Profil *
Dobrý den, ten titulek je asi špatně napsaný, nedokážu to pořádně formulovat ale vysvětlím o co mi jde. Mám následující třídy:
 abstract class AbstractRepository implements IRepository{

    /** @var IMapper */
    private $mapper;

    public function __construct(IMapper $mapper) {
        $this->mapper = $mapper;
    }
}

class UserRepository extends AbstractRepository implements IUserRepository {

    /** @var UserDatabaseMapper */
    private $mapper;

    /**
     * @param UserDatabaseMapper $userDatabaseMapper
     */
    public function __construct(UserDatabaseMapper $userDatabaseMapper) {
        parent::__construct($userDatabaseMapper);
        $this->mapper = $userDatabaseMapper;
    }
}

Obě třídy mají stejnou proměnnou $mapper. Jde mi o to, jestli pokud to mám takto napsané, bude do této proměnné uloženo 2x. Tedy jestli budu mít v paměti 2 stejný objekty ve dvou proměnných. Chci docílit toho, abych nemusel v potomcích mít definovanou proměnnou ale ukládat si jí do rodičovské třídy. Jenomže problém je v anotaci. rodičovská třída má u té proměnné datový typ IMapper ale potomci už pracují například s UserDatabaseMapper, ArticleMapper a mohou mít i jiné metody, které mi IDE nenapoví pokud ta proměnné bude definována jako IMapper.
Děkuji za radu
Keeehi
Profil
ninewi:
Jde mi o to, jestli pokud to mám takto napsané, bude do této proměnné uloženo 2x.
Myslím, že ano. Jelikož je definovaná jako private.

Pokud je třída AbstractRepository takto kompletní, tak je naprosto zbytečná. Smysl by měla, pokud by implementovala nějaké metody společné pro její potomky.
ninewi
Profil *
Mělo tam být protected.
AbstractRepository má další metody společné pro potomky. šlo mi jenom o to, aby každý potom nemusel mít nějakou proměnnou $mapper ale mohl jí mít uloženou u rodiče, jenomže problém je s tím datovým typem...
Keeehi
Profil
Když změníš private za protected tak už je to skoro dobře.

A teď si nejsem úplně jistý. Buď by se mělo vynechat
parent::__construct($userDatabaseMapper);
nebo
$this->mapper = $userDatabaseMapper;

Já myslím, že to druhé ale musel bych to otestovat což teď nemohu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: