Autor Zpráva
cheli
Profil
Zdravím, vysvětlil by mi někdo jan funguje tento kód?

$vystupni_hodnota = $objekt  
                         ->prvniMetoda()  
                         ->druhaMetoda();


jak to mohu použít? Našel sem to v tomto seriálu o OOP, ale podle toho, jak je to tam napsané mi to hází nějaké chyby. Chtěl bych teda pochopit využití tohoto kódu. Děkuju
Majkl578
Profil
Metoda objektu jednoduše vrací instanci sebe sama, takže lze použít "fluentní" přístup. Využívá to například Nette Framework u setterů.
class Foo
{
    public function bar($arg)
    {
        echo $arg, "\n";
        return $this;
    }
}

$inst = new Foo();
$inst->bar(1)->bar(5)->bar(25);
Timy
Profil
Majkl578:
Nechybí tam právě to return $this? :)

class Foo
{
    public function bar($arg)
    {
        echo $arg, "\n";
        return $this;
    }
}

$inst = new Foo();
$inst->bar(1)->bar(5)->bar(25);
Majkl578
Profil
Timy:
Přesně to tam chybí, zkopíroval jsem to moc brzo - než jsem to tam napsal. Opraveno.
__construct
Profil
cheli:
mi to hází nějaké chyby
Napíšeš nám zdroják a aké chyby ?
cheli
Profil
Jestli jsem to teda dobře pochopil, tak se ty funce můžou volat takto:

$inst = new Foo();
$inst->bar(1)->bar(5)->bar(25);


nebo takto:
$inst = new Foo();
$inst->bar(1)
$inst->bar(5)
$inst->bar(25);

a má to stejný význam?
__construct
Profil
Tak sa volať nemôžu to je syntaktická chyba ..
Toto je to isté ako reťazenie..
$inst = new Foo();
$inst->bar(1);
$inst->bar(5);
$inst->bar(25);
cheli
Profil
__construct:
zapomněl jsem tam dát středníky, protože sem upravoval ten fluentní kód, ale významově je to zřejmě stejné.
Ještě POZN: Jaký tam má význam - return $this? Při volání jedné funkce to funguje stejně i když to tam není. Pokud volám 2 funkce jiného názvu, tak to v jedné funkci musí být.
__construct
Profil
$this je pseudopremenná odkazujúca na aktuálny inštanciu objektu - ak metóda nebude vracať odkaz sama na seba a budeš sa snažiť použiť reťazenie dostaneš chybu ktorá Ti povie niečo v tom zmysle, že voláš metódu ktorá, ale nie je priradená objektu - aby si to lepšie pochopil pozri si toto:

<?php
class Object
{
     public function bar($p){
          echo "Už chápeš - ".$p;
     }
}
class Foo
{
    public function bar($arg)
    {
        echo $arg, "\n";
        return $this;
    }
    public function test()
    {
       $obj = new Object();
       return $obj;
    }
}
$inst = new Foo();
$inst->bar(1)->test()->bar(25);


Keď zavoláš prvý krát bar, vráti odkaz sám na seba, keď zavoláš funkciu test, tá vráti odkaz na inú inštanciu .. tak hádaj čo sa vypíše pri volaní poslednej metódy bar ?
Joker
Profil
cheli:
zapomněl jsem tam dát středníky
V tom to není.
Toto:
$foo = new Foo();
$x = $foo->$bar(1)->$bar(2)->$bar(3);
dá stejný výsledek jako tahle delší podoba:
$foo = new Foo();
$x = $foo->bar(1);
$x = $x->bar(2);
$x = $x->bar(3);
Prostě výsledkem té metody je objekt a to další volání volá metodu toho výsledného objektu.
AM_
Profil
cheli:
Jaký tam má význam - return $this?

Máš třídu foo a metodu bar. když ti bar bude vracet třeba to, co má jako argument, hodnota výrazu:
$foo->bar(2)

bude 2. a 2->bar() smysl nedává.
kdežto když bar() vrátí $this, čili odkaz na danou instanci FOO, hodnota výrazu
$foo->bar(2)

bude $foo, a tady ti vzniká ten řetěz, protože z toho plyne, že když bar() lze zavolat na $foo, tak to lze i na $foo->bar().

Jde o to si uvědomit, že zápis
$foo->bar(2)

Není jen "příkaz" zavolej bar() nad $foo, ale je to výraz "vrať hodnotu, kterou získáš tak, že zavoláš bar() nad $foo"
cheli
Profil
Díky všem. Sice se mi odpověď dostala hned v 2. příspěvku, ale není na škodu, když ste mi to vysvětlil každý ze svého pohledu. Hezký den všem
Timy
Profil
Joker:
$x = $foo->$bar(1)->$bar(2)->$bar(3);
Nepřebývají u metod dolary?
cheli
Profil
Timy:
Odpověď bude - v tom to není :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0