Re: class_exists and __autoload
| From: | Alan Knowles | Date: | Tue, 28 Jun 2005 23:22:04 +0000 |
| Subject: | Re: class_exists and __autoload | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-16975@lists.php.net to get a copy of this message | ||
<rant>
This yet again illustrates the sillyness of autoload, if we are going to
have a feature that autoloads classes it should be explicit in it's
usage:
autoload("Class_Name");
defaults to loading Class_Name.php ?
if __autoload exists, it calls that..
adding all sorts of magic to the Class operators is digging a hole that
you will be continually answering...
</rant>
Ok - got up the wrong side of bed this morning ;)
Regards
Alan
On Tue, 2005-06-28 at 14:32 -0700, James Crumpton wrote:
> I opened a bug (http://bugs.php.net/bug.php?id=33459) to report an issue with
> the default behavior of class_exists calling __autoload in PHP5. The bug was
> marked as bogus, and basically stated that it's PEARs problem. After responding,
> the bug can now longer be searched for.
>
> I believe this still requires some attention as the issues around it are very
> similar in nature to the ones with instanceOf and __autoload. (See
> http://news.php.net/php.internals/16746)
>
> Basically, adding __autoload to any script using
> Calendar/DB_DataObject/SOAP/Validate (just to name a few) will throw a fatal error.
>
> Example being:
>
> <?php
> require_once('Calendar/Calendar.php');
>
> $cal = new Calendar();
>
> function __autoload($name) {
> require_once($name);
> }
> ?>
>
> This isn't specific to PEAR however... any script/class that uses
> !class_exists() to load a file not in 'include_path' will fail when __autoload
> is used in conjunction.
>
> Furthermore, I fail to see why such a "feature" is in place when it makes all
> existing if(!class_exists()) {} constructs worthless.
>
> if (!class_exists($className)) {
> // ... do something interesting ...
> // well, with autoload defined, this block will never be reached.
> // autoload will either load the class and the above condition will
> // be false, or autoload will throw a fatal error and we never get here
> }
>
> I just don't understand the logic behind throwing a fatal error when I'm writing
> code to try and prevent one from occurring.
>
> I realize a second parameter is available to class_exists that can be set to
> false, which will prevent __autoload from being called, but developers don't
> always have the luxury of modifying other peoples code to make it work they way
> they intended it (such is the case with PEAR classes).
>
> If someone really wants this behavior (though I can't understand for life of me
> why), then allow them to pass TRUE as the second parameter, but leave the
> default be false. Or at the very least let autoload return false, so that the
> rest of the script can do it's thing... or maybe allow for a php.ini option to
> set the default behavior to false (though this option can make some scripts less
> portable).
>
> -james
>