Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Martina 15. 10. 2013, 17:41:50

Název: Objasnění volání uvnitř class
Přispěvatel: Martina 15. 10. 2013, 17:41:50
Ahoj, když uvnitř class použiju příkaz
Kód: [Vybrat]
$this->foo();tak zavoám metodu s názvem foo(), když
Kód: [Vybrat]
$this->foo;tak zavolam proměnnou foo, ale co je sakryš tohle za zápis?
Kód: [Vybrat]
$this->foo->bar();
Díky, M.
Název: Re:Objasnění volání uvnitř class
Přispěvatel: j 15. 10. 2013, 18:03:50
Zeby volani metody (bar) potomka (foo) tyto klasy?
Název: Re:Objasnění volání uvnitř class
Přispěvatel: jehovista 15. 10. 2013, 18:05:27
Zeby volani metody (bar) potomka (foo) tyto klasy?

Spis volani metody promenne, ne?
Název: Re:Objasnění volání uvnitř class
Přispěvatel: Martina 15. 10. 2013, 18:08:06
Spis volani metody promenne, ne?

Můžeš to upřesnit? Děkuji. M.
Název: Re:Objasnění volání uvnitř class
Přispěvatel: jehovista 15. 10. 2013, 18:13:30
Tady, prvni odpoved:
http://stackoverflow.com/questions/1385429/howto-chain-objects-in-php5-this-foo-bar-baz

Misto promenne
Název: Re:Objasnění volání uvnitř class
Přispěvatel: Sten 15. 10. 2013, 18:23:47
foo je proměnná nějakého typu, který má metodu bar, a tahle metoda je zavolána.
Název: Re:Objasnění volání uvnitř class
Přispěvatel: eMko 15. 10. 2013, 19:24:36
Sten a Jehovista to napsali správně.


class Bar {
    public function barMethod() {
        return ...;
    }
}

class Foo {
    /**
     * $bar je typu bar
     * @var Bar
     */
    var $bar;

    public function __construct() {
        $this->$bar = new Bar(); //někde se instance třídy Bar musí dostat do $bar. Například v konstruktoru, ale je to jedno
    }

    function callBar(){
        //volání metody barMethod na objektu typu Bar, který je v proměnné $bar
        $this->$bar->barMethod();
    }
}


Rozhodně to není volání potomka - potomek je pojem týkající se dědičnosti.


class Cat extends Animal {


Kočka je zvíře - má stejné vlastnosti a "rozumí stejným zprávám" (v ne-akademickém hantecu čti "má stejné metody") jako Zvíře, ale může přidávat vlastní. Kočka je v tomto případě potomek, zvíře předek. Jedná se o modelování vazby "potomek konkretizuje předka" nebo "potomek je předek".

Naproti tomu první příklad je tzv. kompozice. Tedy modelování vazby "Bar má Foo" nebo "Bar se zkládá z Foo".

Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.
Název: Re:Objasnění volání uvnitř class
Přispěvatel: Jozef 16. 10. 2013, 08:45:44
Sten a Jehovista to napsali správně.


class Bar {
    public function barMethod() {
        return ...;
    }
}

class Foo {
    /**
     * $bar je typu bar
     * @var Bar
     */
    var $bar;

    public function __construct() {
        $this->$bar = new Bar(); //někde se instance třídy Bar musí dostat do $bar. Například v konstruktoru, ale je to jedno
    }

    function callBar(){
        //volání metody barMethod na objektu typu Bar, který je v proměnné $bar
        $this->$bar->barMethod();
    }
}


Rozhodně to není volání potomka - potomek je pojem týkající se dědičnosti.


class Cat extends Animal {


Kočka je zvíře - má stejné vlastnosti a "rozumí stejným zprávám" (v ne-akademickém hantecu čti "má stejné metody") jako Zvíře, ale může přidávat vlastní. Kočka je v tomto případě potomek, zvíře předek. Jedná se o modelování vazby "potomek konkretizuje předka" nebo "potomek je předek".

Naproti tomu první příklad je tzv. kompozice. Tedy modelování vazby "Bar má Foo" nebo "Bar se zkládá z Foo".

Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.

Ano, ano toto su zaklady OOP a kto to s programovanim mysli vazne tieto veci by mu mali byt naprosto jasne. Ako sa u nas hovori, aj ked ta o pol noci zobudia...
Název: Re:Objasnění volání uvnitř class
Přispěvatel: Kolemjdoucí 16. 10. 2013, 09:20:20
"rozumí stejným zprávám"
Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.

To je proto že se začátečníkům tlačí do hlavy nesmysly jako třeba zmíněné zprávy pro objekty. Kdyby se jim to řeklo tak jak je to ve skutečnosti, tedy že metoda je převlečená funkce s jedním skrytým parametrem s instancí objektu, pak to není možné nepochopit.
Název: Re:Objasnění volání uvnitř class
Přispěvatel: ryder 16. 10. 2013, 10:49:12
Sten a Jehovista to napsali správně.


class Bar {
    public function barMethod() {
        return ...;
    }
}

class Foo {
    /**
     * $bar je typu bar
     * @var Bar
     */
    var $bar;

    public function __construct() {
        $this->$bar = new Bar(); //někde se instance třídy Bar musí dostat do $bar. Například v konstruktoru, ale je to jedno
    }

    function callBar(){
        //volání metody barMethod na objektu typu Bar, který je v proměnné $bar
        $this->$bar->barMethod();
    }
}


Rozhodně to není volání potomka - potomek je pojem týkající se dědičnosti.


class Cat extends Animal {


Kočka je zvíře - má stejné vlastnosti a "rozumí stejným zprávám" (v ne-akademickém hantecu čti "má stejné metody") jako Zvíře, ale může přidávat vlastní. Kočka je v tomto případě potomek, zvíře předek. Jedná se o modelování vazby "potomek konkretizuje předka" nebo "potomek je předek".

Naproti tomu první příklad je tzv. kompozice. Tedy modelování vazby "Bar má Foo" nebo "Bar se zkládá z Foo".

Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.

jen bych upřesnil že to nemá být $this->$bar ale $this->bar :)
Název: Re:Objasnění volání uvnitř class
Přispěvatel: eMko 16. 10. 2013, 10:49:56
Kolemjdoucí Mám zcela opačný názor. Takovéto chyby vznikají především díky tomu, že se lidi učí sami "jen praktické věci" a na formální věci se vyprdnou, bo "to je teorie, tak to přece není a zajímá mě praxe". To vede k tomu, že nechápou ani základní návrhové vzory, stejně jako jak v objektech zachytit jaké vazby.

Každý jazyk/prostředí je pouze implementací formální teorie. Např. to, že zaslání zprávy = volání metody. Nedávno kolega nevěřícně koukal na třídu Messenger v MVVM Light frameworku, která je zobecněním zasílání zpráv objektům* a došlo mu to až ve chvíli, kdy jsem mu sdělil tuto poučku.

Ne vždy je to samozřejmě chyba pouze těch konkrétních lidí - mnoho knih nebo učebních materiálů se věnuje právě jen implementačním detailům a myšlenku, která je za tím ("The Big Picture"), nechává bez povšimnutí. Nicméně pokud se chceš bavit na toto téma, založ na to prosím separátní thread. Sem to IMHO nepatří a pokud vím, tak toto fórum nemá moderátora a tudíž to nikdo jiný neudělá.

* Jde tam o to, že na mnoho objektů, na kterých potřebuješ volat metody, nemáš referenci. Občas znáš typ, někdy ani to ne.

Název: Re:Objasnění volání uvnitř class
Přispěvatel: eMko 16. 10. 2013, 10:50:54
Ryder Díky. Až se zas budu snažit psát v PHP, čemuž se vyhýbám téměř jako čert kříži, budu na to myslet :-) .
Název: Re:Objasnění volání uvnitř class
Přispěvatel: Kolemjdoucí 16. 10. 2013, 10:57:06
Kolemjdoucí Mám zcela opačný názor.

Tak to se nemáme o čem bavit ;)