Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Karlos 17. 03. 2017, 23:02:29
-
Zdravím,
mám třídu ClassA a ClassB, nyní vytvořím
$obj_a = new ClassA(); (a uvnitř třídy ClassA vytvořím další objekt třídy ClassB)
Můžu nějak v třídě ClassA vrátit returnem objekt ClassB přimo do již vytvořeného objektu $obj_a? Děkuji.
-
Ano.
-
A prozradíš jak?
-
V konstruktoru třídy ClassA zavoláš
$this->obj_b = new ClassB();
Jenom se přitom nepoužívá return, ale pouhé přiřazení.
Výhodnější však bývá injektáž
$obj_b = new ClassB();
$obj_a = new ClassA($obj_b);
protože pak můžeš ve vytvářecí metodě pracovat s oběma objekty, i když je $obj_b vnořený.
-
Na to jsem se ale neptal, v $obj_a musí být ve finále objekt třídy ClassB. Čili pokud neexistuje nějaká magická metoda (kterou jsem nenašel) tak to asi není možný. :-\
-
Přes třetí třídu.. ;)
class classA {
public function identify() {
echo "A";
}
}
class classB {
public function identify() {
echo "B";
}
}
class Holder {
public $myObject;
public function change() {
$this->myObject = new classB();
}
function __construct() {
$this->myObject = new classA();
}
}
$holder = new Holder();
$class = &$holder->myObject;
$class->identify();
$holder->change();
$class->identify();
-
to vypada, ze se snazis pachat nejake kouzlo ktere jde proti veskere logice a vsem dobry postupum...
-
to vypada, ze se snazis pachat nejake kouzlo ktere jde proti veskere logice a vsem dobry postupum...
Snaží se o cosi podivného - pokud proměnné "tajemně" vyměníme její obsah, tak její popis ztratí význam a chováme se proti pravidlům. I ten můj postup s "Holderem" jde proti správným postupům, protože v podstatě pracuje s ukazatelem na proměnnou (v OOP proměnná nemá být proměnná takto vidět přímo). Jenom jsem se řešením bavil, zajímalo mě, jestli bude fungovat. :)
-
jsem si to cetl jeste jednou a mozna se ve vzduchu vznasi *ettery.
-
jsem si to cetl jeste jednou a mozna se ve vzduchu vznasi *ettery.
Jenom to ne :)
Ještě by mohl být řešením vzor Factory Method.
-
Máte převrácenou logiku, místo
if ($input === "X")
$obj_a = new ClassX();
else if ($input === "Y")
$obj_a = new ClassY();
chcete udělat
$obj_a = ClassA($input);
což vám věc nijak neusnadní a znepřehlední kód.
Například v Pythonu to udělat lze, pomocí magické metody __new__, pokud máte metodu, kterou chcete volat nad různými objekty, použijte vzor Dekorátor, viz zde https://cs.wikipedia.org/wiki/Dekor%C3%A1tor
-
Například v Pythonu to udělat lze, pomocí magické metody __new__, pokud máte metodu, kterou chcete volat nad různými objekty, použijte vzor Dekorátor, viz zde https://cs.wikipedia.org/wiki/Dekor%C3%A1tor
jde to jednodušeji. V pythonu je typ objektu uložen v atributu __class__. Můžete ho změnit přímo v konstruktoru.
In [2]: class A:pass
In [3]: class B:
...: def __init__(self):
...: self.__class__ = A
...:
In [4]: a = B()
In [5]: isinstance(a, A)
Out[5]: True
In [6]: isinstance(a, B)
Out[6]: False
-
nebo můžete nahradit self
class B:
def __init__(self):
self = A()
-
nebo můžete nahradit self
class B:
def __init__(self):
self = A()
to je blbost. Beru zpět. Tohle změní self jen lokálně.
-
Zdravím,
mám třídu ClassA a ClassB, nyní vytvořím
$obj_a = new ClassA(); (a uvnitř třídy ClassA vytvořím další objekt třídy ClassB)
Můžu nějak v třídě ClassA vrátit returnem objekt ClassB přimo do již vytvořeného objektu $obj_a? Děkuji.
Krátká odpověď: ne, nejde.
Delší odpověď: Toto šlo naposledy v PHP4ce, a nyní to naštěstí nejde. Při vytváření konstruktoru se vždy vytvoří a vrátí instance "správného" typu.
Jak tu už někteří naznačili, zkus ještě jednou zvážit pohnutky. Pokud opravdu toužíš po rozhodování uvnitř toho objektu, tak jde použít statická metoda na místo konstruktoru.
ClassA::create() // vrací instanci ClassB.
Někdy to bejvá i dobrý nápad.