RobotLoader a přidání nové třídy

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

Pokud nechám RobotLoader vygenerovat cache, poté přidám novou třídu, kterou se pokusím zavolat, skončí script na: Ambiguous class 'Foo' resolution; defined in 0 and in .

Chyba asi bude v podmínce (odkaz na svn):

if (isset($this->list[$class]) && $this->list[$class] !== $file) {
	spl_autoload_call($class); // hack: enables exceptions
        throw new /*\*/InvalidStateException("Ambiguous class '$class' resolution; defined in $file and in " . $this->list[$class] . ".");
}

V $this->list[$class] je FALSE (třída nebyla nalezena, ale při rebuildu již ano) takže to podmínkou projde i když by nemělo?

pmg
Člen | 372
+
0
-

Za tohle se tak trochu cítím být odpovědný. Nejspíš by pomohlo jedno z následujících:

A můžu se zeptat, jestli to skutečně vykreslilo výjimku, nebo to skončilo chybou?

(Testoval jsem jen, jestli to vykreslí výjimku při skutečném ambiguous class s tím, že jsem keš ručně mazal – měl jsem zakázaný autoRebuild a nevšiml jsem si dalších úprav, takže se omlovám. Nejde ale snad o fatální chybu.)

LM
Člen | 206
+
0
-

pmg napsal(a):

A můžu se zeptat, jestli to skutečně vykreslilo výjimku, nebo to skončilo chybou?

Ono se to chová různě, v jedné aplikaci mi to končí uvedenou výjimkou, ale testoval jsem to zvlášť a to skončí: Fatal error: Class 'Foo' not found in ...

pmg
Člen | 372
+
0
-

Jo, tak to je správně. Výjimka se nevykreslí, pokud je rebuild vyvolán přes autoload, s tím se asi nic dělat nedá. Při ručním smazání keše se ale rebuild provede už po zaregistrování loaderu, takže se výjimka zpracuje normálně.

LM
Člen | 206
+
0
-

Ono to bude záležet na verzi PHP, 5.3 tu výjimku ignoruje, ale 5.3.1dev ji vyhodí.

marek.dusek
Člen | 99
+
0
-

jo, s timhle jsem se taky setkal (5.3 stable), pakarna – vyresilo vzdy promazani cache, ale zmatlo ;)

David Grudl
Nette Core | 8228
+
0
-

fixed