Autor Zpráva
mila
Profil
Nevíte, zda se dá nějak zjistit název třidy z metody, která je volána staticky ( foo::bar() )?
Normálně to udělám get_class($this), ale takto není proměná $this definována.
Díky.
xixli
Profil
žeby echo __CLASS__ ?
xixli
Profil
btw keď voláš zvonku foo::bar() tak vieš názov triedy
mila
Profil
__CLASS__ znám, to funguje ale trochu jinak. Vypíše to, v jaké třídě byla metoda definována, ne z které je volána. Což je velký rozdíl. Př.

class a {
function test () {
echo __CLASS__;
}
}
class b extends a {
...
}

b::test(); //vypíše a;

Kdyby mi toto stačilo, tak tam prostě dám echo "a" :)

Jde mi o to, že chci aby každá třída měla metodu debug. Ta dostane text, a pokud je debug on, pak ho vypíše společně s názvem třídy. Takže tuto konstrukci potřebuji hned dvakrát:
-Abych mohl zavolat něco jako get_class($this)::debug('...').
-A aby pak debug věděl, kam patří.

Samozřejmě budu rád i za jiný způsob, jak tento debuging vyřešit.
xixli
Profil
Ja osobne debugging riešim buď cez __destruct + podmienka či ho robiť, alebo cez nejakú významnú funkciu (ktorá je vlastne volaná ako posledná). Mám triedu debugging a funkciu addInfo ktorá mi prosto pridá nejaké tie debug dáta. Ďalej mám triedu manager ktorá sa mi stará o viacero vecí (templaty, pluginy, konfigy, ...) a tá rozhodne či sa bude vkladať debugging ; jednotlivé triedy volajú debugging->addInfo so svojimi dátami, ktorými chcú prispieť. Potom je ešte funkcia shutdown(), ktorú volám na konci skriptu (nemám dobré skúsenosti s register_shutdown_function a __destruct sa nemusí volať na úplnom konci exekúcie skriptu) - tá mi volá debugging->getDebug

Na to dedenie by som to riešil tak, že by som prepísal funkciu debug - nezdedila by sa. Teda __CLASS__ by nebol a ale b.

Prípadne by si mohol spraviť tak, že budeš mať funkcie debug() a debugClass() - jedno by ti dalo normálne informácie a druhé len triedu (nededil by sa len debugClass() ).

Predtým som experimentoval s myšlienkami debuggingu ako získať všetky dáta cez get_declared_classes(), ale tam by som musel dávať aj prefixy (aby som nevolal náhodou php debugging ;-) ). Potom som sa hral s tým, že by som všetky inštancie tried pomenovával ako triedu, ale to sa mi tiež nepáčilo ;-) a tak som to spravil tak, ako som už zmienil vyššie.
Prípadne píš na icq
mila
Profil
Díky za odpověď.

Popravdě jsem se na to už vykašlal, protože nebudu trávuit většinu času tím, aby mi debug vypisoval název třídy.

Pokud jde o tvoje řešení, tak to je o něčem trochu jiném. Nezajímal mě ani tak konkrétní mechanismus debugingu (zda je to echo, nebo funkce volaná na konci skriptu), ale jak mu dodat informaci o třídě, odkud zpráva pochází.

Methoda debug by mohla vypadat třeba takto:

function debug ($zprava, $kod=0) {
global $debugging; //tohle je ten tvuj debugging
$debugging->addInfo ($zprava,$kod, get_class($this)); //dostava i nazev tridy
}

Jde o to, abych tomu debugingu dal název třídy o kterou se jedná a nemusel ji manuálně všude psát.

Jiný příklad, k čemu bych to chtěl - chyby.
Pokud něco nevyjde, chtěl bych vrátit chybu:

function reiseError ($zprava, $kod=0) {
$this->debug ('Error: '.$kod.$zprava, ERROR ); //O chybe by se melo informovat

global $log;
$log->addError ($zprava, $kod, get_class($this)); //pokud to pobezi naostro, je treba ji zalogovat

return new error ($zprava, $kod); //a vrati to objekt chyby
}

Mám tam nějaký objekt $log, do kterého je třeba chybu zapsat. A hodila by se opět vědět třída, abych chybu snadno dohledal.

Tohle by mělo všechno fungovat, dokud nezačnu volat funkce staticky:(
Vždyť to není tak velký požadavek, abych zjistil, jakou třídu jsem zavolal, ne?
xixli
Profil
No asi aj áno, keď to chceš zistiť zo statického volania z class::foo()
ale ako som hovoril, poznáš meno triedy. Možno by si mohol volať takto
class::foo('class') // class je meno triedy, teda mu vlastne povies, ako sa vola
trošičku bolo o tom aj tu: [url=http://www.dgx.cz/trine/item/php-hadanka-vi-zjisteni-nazvu-tridy
]http://www.dgx.cz/trine/item/php-hadanka-vi-zjisteni-nazvu-tridy
[/url]
no ja to riešim na vlastnom cms takto:

class manager
{
// nejake metody, premenne
// ...

public function __construct()
{
// ziska sa appVariables, configVariables, cacheInfo, a este nejake dalsie veci
// ...

// debugging
if($this->configVar('debugging', 'system', TRUE)) {
require($GLOBALS["path:abs"]."/atomcms/libs/debugging.php");
$this->debugging=new debugging;
$GLOBALS["debugging"]=TRUE;
$this->debugging->addInfo("manager::appVars", $this->appVariables);
$this->debugging->addInfo("manager::cnfVars", $this->configVariables);
$this->debugging->addInfo("manager::plugins", $this->cacheInfo["installedPlugins"]);
$this->debugging->addInfo("manager::events", $this->cacheInfo["events"]);
} else {
$GLOBALS["debugging"]=FALSE;
}
}

// nejaky dalsi kod
// ...
}

teda ja natvrdo vypisujem meno triedy - meno triedy manager budem menit tak raz za sto rokov :-)
a potom pokračujem v ostatných triedach štýlom

class parser
{
// ...
if($GLOBALS["debugging"]) {
global $manager;
$manager->debugging->addInfo("parser::variables", $this->tplVars);
$manager->debugging->addInfo("parser::functions", $this->functions);
$manager->debugging->addInfo("parser::classes", $this->classes);
$manager->debugging->addInfo("parser::filters", $filters);
$manager->debugging->addInfo("parser::templates", $this->files);
$manager->debugging->addInfo("parser::captures", $this->capture);
}
// ...
}
llook
Profil
V PHP4 to jde zjistit z debug_backtrace, ale v PHP5 to už nejde. Viz http://llook.wz.cz/weblog/spot/staticky-nazev-tridy

Jediné co mě teď napadá je to logování dělat takhle ošklivě: $this->debug(__CLASS__, 'zpráva');
mila
Profil
Děkuji moc, to je přesně, co jsem hledal. A v diskuzi jsem tam našel skoro přesně to, co jsem chtěl psát.
Mimochodem, je to i odpověď na další otázku, co jsem se právě chystal položit:)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0