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í.
Diskuse
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.
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.
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í.
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(); ?>.
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á?
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 :-)
Diskuse je zrušena z důvodu spamu.