Fix bug in classExists when using multiple autoloaders (i.e. ZF2) #184

Closed
wants to merge 3 commits into
from

Conversation

Projects
None yet
6 participants

The autoloading routine in the classExists method makes the assumption the autoload method always returns a value (i.e. no void) when the autoloading of a class is succesfull. When you have multiple autoloaders registered to the spl stack this can lead to problems. In my case I'm using ZF2 ClassmapAutoloader and StandardAutoloader as fallback. The classmapAutoloader returns nothing so the autoload method in the StandardAutoloader is called as well, because the for loop is continued. This results in a second include, and a fatal error "Cannot redeclare class" is triggered.

Member

schmittjoh commented Sep 17, 2012

Loaders that you pass to the AnnotationRegistry must return a boolean.

However, you can easily wrap the Zend autoloader instead of passing it directly:

AnnotationRegistry::registerLoader(function($name) use ($zendLoader) { 
    $zendLoader->autoload();

    return class_exists($name, false);
});

schmittjoh closed this Sep 17, 2012

The problem has nothing to do with the AnnotationRegistry. Its the fact that Doctrine\Common\ClassLoader::classExists() uses spl_autoload_functions() to see if it can load a class. In my application we have multiple ZF2 autoloaders registered with spl_autoload_register(). This function does not dictate a return value however the Doctrine\Common\ClassLoader::classExists() does not work properly if there are auto load methods / functions registered without a return value.

Member

schmittjoh commented Sep 18, 2012

Ups, I was too fast here!

Sorry :)

schmittjoh reopened this Sep 18, 2012

beberlei was assigned Sep 21, 2012

Owner

Ocramius commented Jan 14, 2013

This was handled in #216

stof closed this Jan 14, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment