php – typová kontrola interface

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip111
Člen | 244
+
0
-

Nepatří to úplně do tohohle fóra, ale mám důvěru ve zdejší lidi :) tak se zeptám.
Mám interface, např. IShoppingCart, ten je implementován třídou ShoppingCartSession

class ShoppingCartSession extends Nette\Object implements IShoppingCart

Potom mám nějakou komponentu, která pracuje s touto třídou ShoppingCartSession, ale striktně používá pouze funkce definované v interfacu a proto bych chtěl udělat typovou kontrolu na IShoppingCart…což se mi ale nedaří.

Konkrétní příklad – objekt ShoppingCartSession předávám komponentě v construktoru:

class CartInfoControl extends \Nette\Application\UI\Control {
	public function __construct($cart) {
	...
	}
}

Takhle to funguje, ale není tam žádná typová kontrola.
Pokud přidám typovou kontrolu na ShoppingCartSession tak to funguje, ok.

public function __construct(ShoppingCartSession  $cart)

Já ale chci mít typovou kontrolu na interface a nikoliv konkrétní implementaci, takže se snažím zprovoznit toto:

public function __construct(IShoppingCart $cart)

A to už nefunguje a hlásí chybu:

Argument 1 passed to EshopModule\CartInfoControl::__construct() must be an instance of EshopModule\IShoppingCart, instance of web123\Eshop\ShoppingCartSession given

Chybě rozumím, ale jak docílím toho abych měl v komponentě typovou kontrolu vstupujícího objektu a mohl tam podstrčit libovolnou instanci interfacu?

Možná teď vypadám jako úplná lama, ale hledám už nějakou dobu na netu a nemůžu najít odpověď…

pekelnik
Člen | 462
+
0
-

Je to vsechno napsane v te chybe, a prestoze nevidim namespace troufnu si tvrdit, ze ti v te komponente chybi use pro ten interface.

use web123\Eshop\IshoppingCart;

Je vyzadovan interface IShoppingCart v namespace EshopModule.

Ale ma byt vyzadovan interface web123\Eshop\IshoppingCart.

Editoval pekelnik (12. 6. 2012 14:36)

Filip111
Člen | 244
+
0
-

Jo, namespace pomohlo.

Pořád jsem si myslel, že kompilátor nedokáže pochopit, že ShoppingCartSession je implementace interfacu IShoppingCart …namespace jsem v tý zprávě úplně přeskočil, nepřikládal jsem jim důležitost. Alespoň, že to funguje jak jsem předpokládal.

Díky.