|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2012-03-16 21:10 UTC] danko at very dot lv
[2012-05-01 13:51 UTC] danko at very dot lv
-Type: Bug
+Type: Documentation Problem
[2012-05-01 13:51 UTC] danko at very dot lv
[2021-10-07 10:45 UTC] cmb@php.net
-Summary: Lack of autoload on type hinting breaks class_alias
+Summary: Clarify when autoloading is triggered
-Status: Open
+Status: Verified
-Package: SPL related
+Package: *General Issues
[2021-10-07 10:45 UTC] cmb@php.net
[2023-04-30 11:27 UTC] hotmonikamehra at gmail dot com
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 14:00:01 2025 UTC |
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