Say I've registered the extra namespace "Tracker_" in the config file for some classes I've written, using
autoloadernamespaces[]="Tracker_"
Things with this namespace and autoloader work as expected except when I am testing for error handling. When I test whether a non-existing class exists, using
class_exists("Tracker_DoesNotExist");
It throws an exception
include_once(Tracker/DoesNotExist.php): failed to open stream: No such file or directory
/path/Zend/Loader.php:146
/path/Zend/Loader.php:146
/path/Zend/Loader.php:94
/path/Zend/Loader/Autoloader.php:479
/path/Zend/Loader/Autoloader.php:124
/other/path/TrackablesMapper.php:40 //line referenced above
Meanwhile, the same class_exists function works for every other case I've tested, i.e.
class_exists("Application_ExistingClass"); //returns true
class_exists("Application_NonExistingClass"); //returns false
class_exists("Tracker_ExistingClass"); //returns true
Am I doing something wrong?
When running a Zend Framework application, it registers its autoloader using spl_autoload_register
(http://php.net/spl_autoload_register). Now any calls to class_exists will use Zend's autoloader (by default class_exists
tries to load the class).
The reason you are getting the error when using class_exists with Tracker_
and not Application_
is because the Application namespace's autoloader is handled by Zend_Application_Module_Autoloader
(Zend_Loader_Autoloader_Resource) which acts slightly different than the Zend_Loader
autoloader.
Zend_Loader
performs some basic security checks and then simply tries to include the file in question. The resource autoloader actually uses a method that first checks to see if the file to be autoloaded is readable and if it is not, then it does not try to include it.
So the reason you are getting the error with Tracker_
is because no error checking is performed when trying to autoload, and Application_
does have error checking.
You can also suppress this by calling Zend_Loader_Autoloader::getInstance()->suppressNotFoundWarnings(true);
Usually you don't want to turn this on though as it can create more confusion later.
Class exists will call the autoloader because if the file containing the class has not yet been included, then the class does not exist, so it needs to attempt to try to load it first, if it fails to autoload it, then you get the include error from zend framework.
Hope that cleared it up a bit for you.