Použití právě vytvořeného objektu

Školení, která pořádám

Občas by se mi hodilo vytvořit objekt, zavolat nějakou jeho metodu a zase objekt zahodit. V PHP se to na rozdíl třeba od JavaScriptu nedá udělat jedním příkazem a nově vytvořený objekt se musí uložit do proměnné:

<?php
$obj = new stdClass;
$obj->f();
?>

Můžeme si ale vytvořit funkci, která objekt vrátí a zavolat ji:

<?php
function identity($return) {
    return $return;
}
identity(new stdClass)->f();
?>

Je to sice možná zajímavá logická hříčka, ale zhoršuje to čitelnost, takže v praxi to využívat nehodlám. Podobný trik lze použít i u vrácených polí.

Jakub Vrána, Řešení problému, 26.10.2009, diskuse: 10 (nové: 0)

Diskuse

Dundee:

Další možností je přidat třídě statickou metodu, která vrátí její instanci.

myclass::getInstance()->foo();

Peter:

getInstance sa zvykne pouzivat ako simple factory method ... Neviem ci je vhodne ju pouzit takymto sposobom (co s parametrami pre konstruktor?). Okrem toho to vyzaduje zasah do samotnej triedy, co nie je vzdy mozne.

ikona v6ak:

Tady bych to odhadl spíš jako Singleton, nicméně souhlasím. Navíc v případě bych možná byl spíš pro vytvoření statické metody, která vytvoří novou instanci a zavolá tu metodu.

ikona v6ak:

Taky mě to už napadlo. S čitelností problém nemám, ale zase nějak moc jsem to nevyužil.

kriplozoik:

Já právě také přemýšlím, kde by se to vůbec dalo využít. Ona je vůbec otázka, jestli v případě jednoho volání to není jen o „módě” využívat na všechno třídy. Na druhou stranu uznávám, že v některých případech mohou takové třídy na jedno zavolání (a to i bez konfigurace a nastavení parametrů) existovat.

Jakube, pěkně vymyšlené řešení - zároveň rozsah (scope) funkce objekt po použití zase zneplatní.

ikona Jakub Vrána OpenID:

Využije se to hlavně s fluent interfacem. Tedy v situaci, kdy metody vrací sám objekt, takže se na ně dají volat další metody: <?php $a->b()->c(); ?>.

ikona v6ak:

To není o scope - ona to ta funkce zase vrací. Ale pak se to (běžně) neukládá, takže to GC (běžně) uklidí.

Jinak další možnost by byla:
<?php
$fooInstance
= identify(new Foo())
  ->serBar(5)
  ->setBaz('fdg');
?>
Tady by se to už hned neuklidilo.

Megaloman:

"...vytvořit objekt, zavolat nějakou jeho metodu a zase objekt zahodit."

Nestačí následující?

<?php
myClass
::f();
?>

Nebo mi něco uniká?

ikona Jakub Vrána OpenID:

Ne, to je statické zavolání metody. Nestatická metoda může pracovat s vlastnostmi objektu naplněnými třeba konstruktorem.

Megaloman:

<?php

class myClass
{
    public function __construct($args)
    {
        // Do something with args
    }

    public function f($params)
    {
        // Special function
    }
}

class
MyExtendedClass extend myClass
{
    public static function callF($args, $params)
    {
        $obj = new __CLASS__($args);
        return $obj->f($params);
    }
}

?>

...no to jsem tomu zase dal :-)

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.