Nette::Object
- Inza
- Člen | 330
mám návrh na vylepšení Nette::Object – co takhle přidat metodu toString? Podobně jako má java?
můj první pokus v tomto směru: (je uveden jen nový kód)
<?php
abstract class Object
{
/* ... */
/** @var integer (uniq id of current object)
*
* @author Tomáš Jukin <jukin@webend.cz>
* @copyright Copyright (c) 2006, 2009 Webend *
*/
private static $iID;
/**
* When new Object is created, iID is incremented
*/
function __construct() {
if(empty(SELF::$iID)) {
SELF::$iID = 0;
}
else SELF::$iID++;
}
/* ... */
/**
* Returns textual representation of this object
*
* @author Tomáš Jukin <jukin@webend.cz>
* @copyright Copyright (c) 2006, 2009 Webend
*
* @return string
*/
public function toString() {
if(empty(Object::$iID)) throw new NotImplementedException(
"If you want use Object's toString() method,
you have to use Object's constructor as well!"
);
return $this->getClass().'-'.Object::$iID;
}
}
?>
Co na to říkáte? Ona stejně hlavní síla toString() metody tkví v jejím překrývání…
Napadá někoho jak to ošéfovat tak aby nebylo nutné volat explicitně konstruktor?
A ještě by se to možná mohlo poladit tak, aby bylo samostatné ID pro každou třídu. Dalo by se potom pomocí toho navíc poznat, kolik objektů už existuje od jaké třídy…
- Honza Marek
- Člen | 1664
K čemu to potřebuješ? Defaultní toString je podle mě v Javě vcelku na prd.
A pokud potřebuješ počítat objekty třídy, tak bych to dělal asi takto:
class Trida {
public static $counter = 0;
public function __construct() {
$counter++;
}
}
Editoval Honza M. (11. 2. 2009 21:02)
- pmg
- Člen | 372
/** @var integer (uniq id of current object)
*
* @author Tomáš Jukin <jukin@webend.cz>
* @copyright Copyright (c) 2006, 2009 Webend *
*/
private static $iID;
To mě pobavilo. Nechtěl bys k té deklaraci rovnou přibalit i licenci?
Jedinečný identifikátor objektu vrací funkce spl_object_hash a komponenty mají pro podobný účel pěknou metodu lookupPath.
- kravčo
- Člen | 721
Inza napsal(a):
Co na to říkáte? Ona stejně hlavní síla toString() metody tkví v jejím překrývání…
Triedy frameworku, ktoré sa vedia konvertovať na string na to používajú
vcelku úspešne magickú metódu PHP menom __toString()
.
Používajú ju len tie, ktoré ju potrebujú a vzhľadom na minimum
spoločných vlastností by ju bolo zbytočné implentovať pre všetky, keď by
sa aj tak neskôr prekryla.
A ještě by se to možná mohlo poladit tak, aby bylo samostatné ID pro každou třídu. Dalo by se potom pomocí toho navíc poznat, kolik objektů už existuje od jaké třídy…
Máš nejaký príklad z praxe, kedy potrebuješ rátať inštancie všemožných objektov, nie len nejakej veľmi obmedzenej skupiny?
- Inza
- Člen | 330
pmg napsal(a):
/** @var integer (uniq id of current object) * * @author Tomáš Jukin <jukin@webend.cz> * @copyright Copyright (c) 2006, 2009 Webend * */ private static $iID;
To mě pobavilo. Nechtěl bys k té deklaraci rovnou přibalit i licenci?
Jedinečný identifikátor objektu vrací funkce spl_object_hash a komponenty mají pro podobný účel pěknou metodu lookupPath.
Legrace musí být, ne?;-) – Berme věci vážně, ale s humorem…;-)
- Inza
- Člen | 330
kravco napsal(a):
Inza napsal(a):
Co na to říkáte? Ona stejně hlavní síla toString() metody tkví v jejím překrývání…
Triedy frameworku, ktoré sa vedia konvertovať na string na to používajú vcelku úspešne magickú metódu PHP menom
__toString()
. Používajú ju len tie, ktoré ju potrebujú a vzhľadom na minimum spoločných vlastností by ju bolo zbytočné implentovať pre všetky, keď by sa aj tak neskôr prekryla.A ještě by se to možná mohlo poladit tak, aby bylo samostatné ID pro každou třídu. Dalo by se potom pomocí toho navíc poznat, kolik objektů už existuje od jaké třídy…
Máš nejaký príklad z praxe, kedy potrebuješ rátať inštancie všemožných objektov, nie len nejakej veľmi obmedzenej skupiny?
To nemám, s tím souhlasím – všeobecně to použitelné není – právě proto to řeším;-) a udělal jsem na to vlákno…