Jak v PHP získat objekt uvnitř třídy

Karlos

Jak v PHP získat objekt uvnitř třídy
« 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.


Kit

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #1 kdy: 18. 03. 2017, 00:18:31 »
Ano.

Karlos

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #2 kdy: 18. 03. 2017, 00:53:25 »
A prozradíš jak?

Kit

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #3 kdy: 18. 03. 2017, 08:34:03 »
V konstruktoru třídy ClassA zavoláš
Kód: [Vybrat]
$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áž
Kód: [Vybrat]
$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ý.

Karlos

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #4 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ý.  :-\


Nemo7

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #5 kdy: 18. 03. 2017, 14:00:11 »
Přes třetí třídu..  ;)
Kód: [Vybrat]
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();

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #6 kdy: 18. 03. 2017, 14:23:15 »
to vypada, ze se snazis pachat nejake kouzlo ktere jde proti veskere logice a vsem dobry postupum...
Děkuji za možnost editace příspěvku.

Nemo7

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #7 kdy: 18. 03. 2017, 14:32:10 »
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. :)

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #8 kdy: 18. 03. 2017, 14:37:33 »
jsem si to cetl jeste jednou a mozna se ve vzduchu vznasi *ettery.
Děkuji za možnost editace příspěvku.

Kit

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #9 kdy: 18. 03. 2017, 16:28:10 »
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.

Ivan Nový

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #10 kdy: 18. 03. 2017, 22:57:02 »
Máte převrácenou logiku, místo
Kód: [Vybrat]
if ($input === "X")
    $obj_a = new ClassX();
else if ($input === "Y")
     $obj_a = new ClassY();
chcete udělat
Kód: [Vybrat]
$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

gll

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #11 kdy: 18. 03. 2017, 23:29:48 »
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.

Kód: [Vybrat]
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

gll

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #12 kdy: 18. 03. 2017, 23:41:02 »
nebo můžete nahradit self

Kód: [Vybrat]
class B:
    def __init__(self):
        self = A()

gll

Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #13 kdy: 18. 03. 2017, 23:43:55 »
nebo můžete nahradit self

Kód: [Vybrat]
class B:
    def __init__(self):
        self = A()

to je blbost. Beru zpět. Tohle změní self jen lokálně.

BoneFlute

  • *****
  • 1 971
    • Zobrazit profil
Re:Jak v PHP získat objekt uvnitř třídy
« Odpověď #14 kdy: 19. 03. 2017, 02:51:37 »
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.