Edit report at https://bugs.php.net/bug.php?id=61422&edit=1
ID: 61422
Updated by: [email protected]
Reported by: danko at very dot lv
-Summary: Lack of autoload on type hinting breaks class_alias
+Summary: Clarify when autoloading is triggered
-Status: Open
+Status: Verified
Type: Documentation Problem
-Package: SPL related
+Package: *General Issues
Operating System: Linux
PHP Version: 5.4.0
Block user comment: N
Private report: N
New Comment:
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>
Previous Comments:
------------------------------------------------------------------------
[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.