Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Karlos kdy 17. 03. 2017, 23:02:29

Název: Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Karlos kdy 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.
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Kit kdy 18. 03. 2017, 00:18:31
Ano.
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Karlos kdy 18. 03. 2017, 00:53:25
A prozradíš jak?
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Kit kdy 18. 03. 2017, 08:34:03
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ý.
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Karlos kdy 18. 03. 2017, 11:58:30
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ý.  :-\
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Nemo7 kdy 18. 03. 2017, 14:00:11
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();
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: to_je_jedno kdy 18. 03. 2017, 14:23:15
to vypada, ze se snazis pachat nejake kouzlo ktere jde proti veskere logice a vsem dobry postupum...
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Nemo7 kdy 18. 03. 2017, 14:32:10
Citace od: to_je_jedno kdy 18. 03. 2017, 14:23:15
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. :)
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: to_je_jedno kdy 18. 03. 2017, 14:37:33
jsem si to cetl jeste jednou a mozna se ve vzduchu vznasi *ettery.
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Kit kdy 18. 03. 2017, 16:28:10
Citace od: to_je_jedno kdy 18. 03. 2017, 14:37:33
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.
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: Ivan Nový kdy 18. 03. 2017, 22:57:02
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
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: gll kdy 18. 03. 2017, 23:29:48
Citace od: Ivan Nový kdy 18. 03. 2017, 22:57:02
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

Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: gll kdy 18. 03. 2017, 23:41:02
nebo můžete nahradit self


class B:
    def __init__(self):
        self = A()

Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: gll kdy 18. 03. 2017, 23:43:55
Citace od: gll kdy 18. 03. 2017, 23:41:02
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ě.
Název: Re:Jak v PHP získat objekt uvnitř třídy
Přispěvatel: BoneFlute kdy 19. 03. 2017, 02:51:37
Citace od: Karlos kdy 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.
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.