Objasnění volání uvnitř class

Martina

Objasnění volání uvnitř class
« kdy: 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.


j

Re:Objasnění volání uvnitř class
« Odpověď #1 kdy: 15. 10. 2013, 18:03:50 »
Zeby volani metody (bar) potomka (foo) tyto klasy?

jehovista

Re:Objasnění volání uvnitř class
« Odpověď #2 kdy: 15. 10. 2013, 18:05:27 »
Zeby volani metody (bar) potomka (foo) tyto klasy?

Spis volani metody promenne, ne?

Martina

Re:Objasnění volání uvnitř class
« Odpověď #3 kdy: 15. 10. 2013, 18:08:06 »
Spis volani metody promenne, ne?

Můžeš to upřesnit? Děkuji. M.

jehovista

Re:Objasnění volání uvnitř class
« Odpověď #4 kdy: 15. 10. 2013, 18:13:30 »


Sten

Re:Objasnění volání uvnitř class
« Odpověď #5 kdy: 15. 10. 2013, 18:23:47 »
foo je proměnná nějakého typu, který má metodu bar, a tahle metoda je zavolána.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Objasnění volání uvnitř class
« Odpověď #6 kdy: 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.

Jozef

Re:Objasnění volání uvnitř class
« Odpověď #7 kdy: 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...

Kolemjdoucí

Re:Objasnění volání uvnitř class
« Odpověď #8 kdy: 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.

ryder

Re:Objasnění volání uvnitř class
« Odpověď #9 kdy: 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 :)

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Objasnění volání uvnitř class
« Odpověď #10 kdy: 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.


eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Objasnění volání uvnitř class
« Odpověď #11 kdy: 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 :-) .

Kolemjdoucí

Re:Objasnění volání uvnitř class
« Odpověď #12 kdy: 16. 10. 2013, 10:57:06 »
Kolemjdoucí Mám zcela opačný názor.

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