get_called_class (potreti)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
wdolek
Člen | 331
+
0
-

vidim takovou malou nesrovnalost v dokumentaci (?) nebo sem si vse spatne vysvetlitl… jiz se tu o tom psalo:

https://forum.nette.org/…ss-z-php-5-3

https://forum.nette.org/…od-php-5-2-x

jenze pak vidim dokumentaci: https://api.nette.org/….Object.html#…

a moc nerozumim tomu parametru name a callback. cekal bych, ze „name“ je nove jmeno metody na objektu a callback je … callback. dle prvniho fora to tak (?) asi neni.

konkretni priklad: stahl jsem si Nette.Extras reCAPTCHA od Jake Cooney, https://forum.nette.org/…ha-pro-nette

… pri pridani pole do formulare mi pak Nette vyhodi vyjimku, ze get_called_class neexistuje. puvodni nastaveni z reCAPTCHA bylo:

FormContainer::extensionMethod('addRecaptcha', array('reCAPTCHA', 'addRecaptcha'));

… a to jsem zmenil na

FormContainer::extensionMethod('addRecaptcha', 'reCAPTCHA::addRecaptcha');

ale chyba lavky – $name je parametr prvni… mam tedy napsat:

FormContainer::extensionMethod('FormContainer::addRecaptcha', 'reCAPTCHA::addRecaptcha');
FormContainer::extensionMethod('FormContainer::addRecaptcha', array('reCAPTCHA', 'addRecaptcha'));

?

wdolek
Člen | 331
+
0
-

… mimochodem, odpoved zni ano… „FormContainer::addRecaptcha“ :) …

btw: pri brouzdani zdrojaky Nette jsem narazil na takoveto veci

	public static function extensionMethod($name, $callback = NULL)
	{
		if (strpos($name, '::') === FALSE) {
			$class = get_called_class();
		} else {
			list($class, $name) = explode('::', $name);
		}
		return ObjectMixin::extensionMethod($class, $name, $callback);
	}

ackoliv to PHP povoluje, povazuji to za takovou malou „prasarnicku“ – promennou $class bych pred if blok alespon naplnil NULL nebo prazdnym stringem…

redhead
Člen | 1313
+
0
-

Z hlediska jazyku je to prostě správně, pokud nemůže být jedna automaticky bude druhá, čili nevidím důvod proč psát $class = NULL pokud jsme si jisti že NULL prostě nikdy nebude..

David Grudl
Nette Core | 8228
+
0
-

wdolek napsal(a):

ale chyba lavky – $name je parametr prvni… mam tedy napsat:

FormContainer::extensionMethod('FormContainer::addRecaptcha', 'reCAPTCHA::addRecaptcha');
FormContainer::extensionMethod('FormContainer::addRecaptcha', array('reCAPTCHA', 'addRecaptcha'));

Je to kvůli vadě PHP < 5.3, kvůli které nelze zjistit, na jaké třídě je statická metoda volána. Takže ono duplicitní FormContainer:: je workaround chyby PHP. Ve verzi 5.3 už to není potřeba uvádět.