RobotLoader a přidání nové třídy
- LM
- Člen | 206
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
Za tohle se tak trochu cítím být odpovědný. Nejspíš by pomohlo jedno z následujících:
- při skutečném započetí rebuildu vyprázdnit seznam tříd,
- nastavit
$this->list[$class] = FALSE
až po vyzkoušení rebuildu, - kontrolovat
položku pole na hodnotu
FALSE
.
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.)
- pmg
- Člen | 372
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ě.
- marek.dusek
- Člen | 99
jo, s timhle jsem se taky setkal (5.3 stable), pakarna – vyresilo vzdy promazani cache, ale zmatlo ;)