Doc #61422 [Com]: Clarify when autoloading is triggered
[email protected] ("hotmonikamehra at gmail dot com") Sun, 30 Apr 2023 11:27:34 +0000
| Newsgroups | php.doc.bugs |
|---|---|
| Message-ID | <[email protected]> |
Edit report at https://bugs.php.net/bug.php?id=61422&edit=1 ID: 61422 Comment by: hotmonikamehra at gmail dot com Reported by: danko at very dot lv Summary: Clarify when autoloading is triggered Status: Verified Type: Documentation Problem Package: *General Issues Operating System: Linux PHP Version: 5.4.0 Block user comment: N Private report: N New Comment: I Am Monika Mehra Chandigarh Girl (http://www.monikamehra.in)github.com Previous Comments: ------------------------------------------------------------------------ [2021-10-07 10:45:53] [email protected] This has nothing to do with class_exist(), but is rather because type declarations of free standing functions never trigger autoloading[1]. [1] <https://3v4l.org/NuX6K> ------------------------------------------------------------------------ [2012-05-01 13:51:10] danko at very dot lv It hit me that: - The behaviour is consistent with instanceof - Calling autoload in instanceof is unacceptable (for obvious reasons), no bug here. - The case with instanceof is much worse, since instead of raising an error instanceof returns a WRONG RESULT and it is the CORRECT BEHAVIOUR. - This is hardly obvious and is bound to lead to some beautiful glitches. I therefore propose that a warning is placed on the page for __autoload / spl_autoload_register and/or class_alias (if it is, indeed, the only thing this problem would break). ------------------------------------------------------------------------ [2012-03-16 21:10:16] danko at very dot lv Sorry, what I meant in the last example is // Create a Demo object using "Y", // and pass that to function expecting "X" ------------------------------------------------------------------------ [2012-03-16 21:06:27] danko at very dot lv Description: ------------ I found #39003 which implies that autoload *was* called for type hinting previously and called for removal of this "unnecessary" feature. I beg to differ. Our framework depends on using class_alias to provide a dynamic modular structure, and one real class may have multiple aliases depending on situation, and these aliases are currently added when needed. Therefore, if an object is creating using alias X (or no alias at all) and is passed to a function expecting the same class under alias Y (and no object was created using that alias) a completely invalid fatal error is raised (see a simplified demo below). I would also like to point out, that if after calling autoload it turns out that it was not, in fact, an alias, the call will fatally fail anyway, so a really useless autoload will be only called once. I don't see any "resource consumption" problem here. Test script: --------------- <? class Demo { } // An "autoload" handler creating an alias for the same class spl_autoload_register(function ($class) { class_alias('Demo', $class); }); // Create a Demo object using "A" // and pass that to function expecting "A" function success(A $test) { echo "Success ".get_class($test)."\n"; } success(new A()); // Create a Demo object using "B", // then create another Demo object using "C" // and pass that to function expecting "B" function also(B $test) { echo "Success ".get_class($test)."\n"; } new B(); also(new C()); // Create a Demo object using "X", // and pass that to function expecting "B" function fail(X $test) { echo "Success ".get_class($test)."\n"; } fail(new Y()); // Note that all of these names refer to the same class, // and all objects are of the same class Expected result: ---------------- Success Demo Success Demo Success Demo Actual result: -------------- Success Demo Success Demo PHP Catchable fatal error: Argument 1 passed to fail() must be an instance of X, instance of Demo given ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=61422&edit=1