ZF-8158: Autoload bug with class_exists

Description

In several places (I've only inidicated ones I've run into), class_exists() is called prior to calling Zend_Loader, however, it's called without overriding the default autoload behaviour, and is thus likely to interfere with autoload behaviour happening outside the framework and disable the internal use of Zend_Loader for Zend components. This was introduced in Zend framework 1.8.2. Various instances of this approach have since been fixed as bugs, such as http://framework.zend.com/issues/browse/ZF-6660 and http://zendframework.com/issues/browse/ZF-6591 so I think these should be fixed too.

I suspect that all uses of class_exists should be checked.

Comments

Yes, this is still present in 1.10.6 and it means I can't use ZF at all!

A quick grep finds me 97 instances of class_exists without a 'false' second parameter (though I'm not trying to resurrect #10053 here). I don't know if it's worth me generating what would be a pretty huge patch for all of them, plus I don't know ZF well enough to be able to fix all of them sensibly - are partial patches welcome?

(I've deleted my earlier comment as it was off-topic.)

ZF-6660 and ZF-6591 were special cases. In general, we want class_exists() without the second parameter (false) whenever it precedes a loadClass(), because it allows other autoloaders to execute.

If you've implemented your own autoloader, just make sure it doesn't throw an exception when the file/class is not found.

It's a shame you deleted your comment as it contained two of the instances that I'd run into! I'm calling Zend_Feed:import, which correctly uses Zend_Loader to load Zend_Http_Client, which correctly uses Zend_Loader to load Zend_Uri, but unfortunately that doesn't use Zend_Loader and calls class_exists before trying to load Zend_Uri_Http and thus breaks. Consistency is the key here, and your previously posted fix works perfectly in this case. "allowing other autoloaders to execute" is precisely what's breaking ZF; my autoloader is not compatible with ZF, nor should it need to be, and it's why Zend_Loader exists. Zend_Loader DOES call class_exists without the second param, so we should be using it everywhere, and not clumsily circumventing it randomly. As it stands it renders ZF unusable as a component library; if I can't load a component and call a function in it without breaking my app, it's broken. I'll post a patch for just this specific case rather than trying to fix anything bigger. Given that ZF2 has a very clear aim of doing everything with Zend_Loader via autoload, it seems silly not to head in vaguely the same direction in 1.x.

Diff against 1.10.6 to fix a couple of the mentioned instances of this problem.

Fixed for Zend_Http_Client in trunk rev.22537 (also noticed one more place where class_exists was used)

Fixed for Zend_Uri in trunk rev.22538

Fixes for Zend_Uri and Zend_Http_Client merged to release branch in 22539. Thanks for the patch!

marking this issue as resolved in 1.10.7