Použití právě vytvořeného objektu
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
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. v6ak:
 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.
 v6ak:
 v6ak:  v6ak:
 v6ak: 
Taky mě to už napadlo. S čitelností problém nemám, ale zase nějak moc jsem to nevyužil.
 v6ak:
 v6ak: 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í.
 Jakub Vrána
 Jakub Vrána   :
: 
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(); ?>.
 Jakub Vrána
 Jakub Vrána   :
:  v6ak:
 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.
 v6ak:
 v6ak: 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á?
 Jakub Vrána
 Jakub Vrána   :
: 
Ne, to je statické zavolání metody. Nestatická metoda může pracovat s vlastnostmi objektu naplněnými třeba konstruktorem.
 Jakub Vrána
 Jakub Vrána   :
: Megaloman:
<?phpclass 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.
 © 2005-2025 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í
© 2005-2025 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í  .
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.
.
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.


